www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

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?)