31 lines
899 B
Racket
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))
|