Make bare union constructor smarter.
This commit is contained in:
parent
4b3e621d0f
commit
78c4809177
|
@ -30,9 +30,20 @@
|
||||||
(define -future make-Future)
|
(define -future make-Future)
|
||||||
(define (-seq . args) (make-Sequence args))
|
(define (-seq . args) (make-Sequence args))
|
||||||
|
|
||||||
|
|
||||||
|
(define (flat t)
|
||||||
|
(match t
|
||||||
|
[(Union: es) es]
|
||||||
|
[(Values: (list (Result: (Union: es) _ _))) es]
|
||||||
|
[(Values: (list (Result: t _ _))) (list t)]
|
||||||
|
[_ (list t)]))
|
||||||
|
|
||||||
|
;; Simple union constructor.
|
||||||
|
;; Flattens nested unions and sorts types, but does not check for
|
||||||
|
;; overlapping subtypes.
|
||||||
(define-syntax *Un
|
(define-syntax *Un
|
||||||
(syntax-rules ()
|
(syntax-rules ()
|
||||||
[(_ . args) (make-Union (list . args))]))
|
[(_ . args) (make-Union (remove-dups (sort (apply append (map flat (list . args))) type<?)))]))
|
||||||
|
|
||||||
|
|
||||||
(define (make-Listof elem) (-mu list-rec (*Un (-val null) (-pair elem list-rec))))
|
(define (make-Listof elem) (-mu list-rec (*Un (-val null) (-pair elem list-rec))))
|
||||||
|
|
|
@ -15,19 +15,14 @@
|
||||||
|
|
||||||
(define empty-union (make-Union null))
|
(define empty-union (make-Union null))
|
||||||
|
|
||||||
(define (flat t)
|
|
||||||
(match t
|
|
||||||
[(Union: es) es]
|
|
||||||
[(Values: (list (Result: (Union: es) _ _))) es]
|
|
||||||
[(Values: (list (Result: t _ _))) (list t)]
|
|
||||||
[_ (list t)]))
|
|
||||||
|
|
||||||
(define (remove-subtypes ts)
|
(define (remove-subtypes ts)
|
||||||
(let loop ([ts* ts] [result '()])
|
(let loop ([ts* ts] [result '()])
|
||||||
(cond [(null? ts*) (reverse result)]
|
(cond [(null? ts*) (reverse result)]
|
||||||
[(ormap (lambda (t) (subtype (car ts*) t)) result) (loop (cdr ts*) result)]
|
[(ormap (lambda (t) (subtype (car ts*) t)) result) (loop (cdr ts*) result)]
|
||||||
[else (loop (cdr ts*) (cons (car ts*) result))])))
|
[else (loop (cdr ts*) (cons (car ts*) result))])))
|
||||||
|
|
||||||
|
;; Union constructor
|
||||||
|
;; Normalizes representation by sorting types.
|
||||||
(define Un
|
(define Un
|
||||||
(case-lambda
|
(case-lambda
|
||||||
[() empty-union]
|
[() empty-union]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user