prefab.rkt (2610B)
1 #lang typed/racket/base 2 3 (module m1 racket/base 4 (require alexis/bool 5 racket/function) 6 7 (provide prefab-struct?) 8 9 (define prefab-struct? (compose true? prefab-struct-key))) 10 11 (module m2 typed/racket/base 12 (provide PrefabKey 13 PrefabTop 14 prefab-struct? 15 make-prefab-struct 16 ;; Imprecise type (m3 gives a more precise type to these): 17 prefab-struct-key 18 prefab-key?) 19 20 (define-type PrefabKey (U Symbol 21 (List Symbol 22 ; Optional: Nonnegative-Integer 23 (List Nonnegative-Integer Any) 24 (Vectorof Nonnegative-Integer)) 25 (List Symbol 26 Nonnegative-Integer ; Optional 27 (List Nonnegative-Integer Any) 28 (Vectorof Nonnegative-Integer)) 29 (List* Symbol 30 ; Optional: Nonnegative-Integer 31 (List Nonnegative-Integer Any) 32 (Vectorof Nonnegative-Integer) 33 PrefabKey) 34 (List* Symbol 35 Nonnegative-Integer ; Optional 36 (List Nonnegative-Integer Any) 37 (Vectorof Nonnegative-Integer) 38 PrefabKey))) 39 40 (require typed/racket/unsafe) 41 (unsafe-require/typed (submod ".." m1) [#:opaque PrefabTop prefab-struct?]) 42 43 (require/typed racket [make-prefab-struct (→ PrefabKey Any * PrefabTop)]) 44 45 (require/typed racket 46 [prefab-struct-key (→ Any (U #f PrefabKey))] 47 [prefab-key? (→ Any Boolean)])) 48 49 (module m3 typed/racket/base 50 (require typed/racket/unsafe) 51 (require (except-in (submod ".." m2) prefab-struct-key prefab-key?)) 52 53 (provide prefab-struct-key prefab-key?) 54 55 ;; Give a more precise type, while still ensuring that at least part of it 56 ;; is validated by a contract: 57 (unsafe-require/typed (submod ".." m2) 58 [prefab-struct-key (case→ (→ PrefabTop PrefabKey) 59 (→ Any #f))] 60 [prefab-key? (→ Any Boolean : PrefabKey)])) 61 62 (require (except-in 'm2 prefab-struct-key prefab-key?) 63 'm3) 64 65 (provide PrefabKey 66 PrefabTop 67 prefab-struct? 68 make-prefab-struct 69 prefab-struct-key 70 prefab-key?)