typed-racket/typed-racket-test/succeed/poly-struct-parent.rkt
2014-12-16 10:07:25 -05:00

31 lines
899 B
Racket

#lang typed/racket
(define-struct: (A) Box ([value : A]) #:transparent)
(define-struct: (A B) (Child-Box Box) ([other-value : B]) #:transparent)
(: v1 Symbol)
(define v1 (Box-value (Child-Box 'sym "str")))
(: v2 String)
(define v2 (Child-Box-other-value (Child-Box 'sym "str")))
(struct: (A) Box2 ([proc : (-> A)]))
(struct: (A) Strict-Box2 Box2 ())
(struct: (A) Mutable-Box2 Strict-Box2 ([value : (Vector A)]))
(: box-mutable2 (All (A) ((Box2 A) -> (Mutable-Box2 A))))
(define (box-mutable2 b)
(define v ((Box2-proc b)))
(define vs (vector v))
(Mutable-Box2 (λ () (vector-ref vs 0)) vs))
(: box-strict2 (All (A) ((Box2 A) -> (Box2 A))))
(define (box-strict2 b)
(cond
[(Strict-Box2? b) b]
[else (box-mutable2 b)]))
(box-mutable2 (Box2 (λ () 0)))
(box-strict2 (box-mutable2 (Box2 (λ () 0))))
(ann (ann (box-mutable2 (Box2 (λ () 0))) (Mutable-Box2 Integer)) (Box2 Number))