                    :header (spec/? ::sized-type)
                    :data ::sized-type))
 
+(spec/def ::type (spec/or :sized-type ::sized-type
+                          :primitive ::primitive
+                          :array ::array
+                          :dynamic ::dynamic))
+                       
+
 ;; How to specify one:
-;; (value [:record :a :double :b double] [3 [4 9]])
+;; (value [:record :a :number :b double] [3 [4 9]])
 
-(assert (spec/valid? ::double :double))
-(assert (spec/valid? ::union [:union :double :double]))
+(assert (spec/valid? ::number :number))
+(assert (spec/valid? ::union [:union :number :number]))
 (assert (spec/valid? ::record [:record 
-                               :a :double 
+                               :a :number 
                                :b [:vec nil 3]]))
-(assert (spec/valid? ::tagged [:tag 119 [:vec :double 3]]))
+(assert (spec/valid? ::tagged [:tag 119 [:vec :number 3]]))
 (assert (spec/valid? ::array [:array [:record :a nil :b nil]]))
 (assert (spec/valid? ::array [:array [:record :a nil :b nil] nil]))
 (assert (spec/valid? ::vecdata [:vecdata 3 4 5]))


(spec/def ::vecdata (spec/cat
                     :type (partial = :vecdata)
                     :values (spec/* ::sized-type)))

;; Compile time tagging
(spec/def ::tagged (spec/cat

                    :tag (constantly true)
                    :data ::sized-type))

(spec/def ::sized-type (spec/or :number ::number
                                :record ::record
                                :union ::union
                                :unspecified ::unspecified ;; <-- a primitive building block
                                :tagged ::tagged
                                :vec ::vec
                                :vecdata ::vecdata))
