Make bare union constructor smarter.

original commit: 78c4809177e6781a42dd29dd9b0bb96c77fa0e01
This commit is contained in:
Vincent St-Amour 2011-01-06 15:42:35 -05:00
parent 6473431d0d
commit ddd166c799
2 changed files with 14 additions and 8 deletions

View File

@ -30,9 +30,20 @@
(define -future make-Future)
(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
(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))))

View File

@ -15,19 +15,14 @@
(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)
(let loop ([ts* ts] [result '()])
(cond [(null? ts*) (reverse result)]
[(ormap (lambda (t) (subtype (car ts*) t)) result) (loop (cdr ts*) result)]
[else (loop (cdr ts*) (cons (car ts*) result))])))
;; Union constructor
;; Normalizes representation by sorting types.
(define Un
(case-lambda
[() empty-union]