diff --git a/collects/typed-scheme/types/abbrev.rkt b/collects/typed-scheme/types/abbrev.rkt index c76aa1ce..fb089202 100644 --- a/collects/typed-scheme/types/abbrev.rkt +++ b/collects/typed-scheme/types/abbrev.rkt @@ -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