diff options
Diffstat (limited to 'stdlib/source/lux/type.lux')
-rw-r--r-- | stdlib/source/lux/type.lux | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/stdlib/source/lux/type.lux b/stdlib/source/lux/type.lux index 8142fc524..af6048ac9 100644 --- a/stdlib/source/lux/type.lux +++ b/stdlib/source/lux/type.lux @@ -8,8 +8,9 @@ ["." function] ["." exception (#+ exception:)] ["<>" parser - ["<c>" code (#+ Parser)]]] + ["<.>" code (#+ Parser)]]] [data + ["." product] ["." maybe] ["." text ("#\." monoid equivalence)] ["." name ("#\." equivalence codec)] @@ -351,11 +352,31 @@ _ #0)) -(def: #export (array depth elem_type) +(def: #export (array depth element_type) (-> Nat Type Type) (case depth - 0 elem_type - _ (|> elem_type (array (dec depth)) (list) (#.Primitive array.type_name)))) + 0 element_type + _ (|> element_type + (array (dec depth)) + (list) + (#.Primitive array.type_name)))) + +(def: #export (flatten_array type) + (-> Type [Nat Type]) + (case type + (^multi (^ (#.Primitive name (list element_type))) + (text\= array.type_name name)) + (let [[depth element_type] (flatten_array element_type)] + [(inc depth) element_type]) + + _ + [0 type])) + +(def: #export array? + (-> Type Bit) + (|>> ..flatten_array + product.left + (n.> 0))) (syntax: (new_secret_marker) (macro.with_gensyms [g!_secret_marker_] @@ -364,9 +385,9 @@ (def: secret_marker (`` (name_of (~~ (new_secret_marker))))) -(syntax: #export (:log! {input (<>.or (<>.and <c>.identifier - (<>.maybe (<>.after (<c>.identifier! ..secret_marker) <c>.any))) - <c>.any)}) +(syntax: #export (:log! {input (<>.or (<>.and <code>.identifier + (<>.maybe (<>.after (<code>.identifier! ..secret_marker) <code>.any))) + <code>.any)}) (case input (#.Left [valueN valueC]) (do meta.monad @@ -392,12 +413,12 @@ (def: type_parameters (Parser (List Text)) - (<c>.tuple (<>.some <c>.local_identifier))) + (<code>.tuple (<>.some <code>.local_identifier))) (syntax: #export (:cast {type_vars type_parameters} input output - {value (<>.maybe <c>.any)}) + {value (<>.maybe <code>.any)}) (let [casterC (` (: (All [(~+ (list\map code.local_identifier type_vars))] (-> (~ input) (~ output))) (|>> :assume)))] @@ -414,7 +435,7 @@ (def: typed (Parser Typed) - (<>.and <c>.any <c>.any)) + (<>.and <code>.any <code>.any)) ## TODO: Make sure the generated code always gets optimized away. (syntax: #export (:share {type_vars ..type_parameters} @@ -430,7 +451,7 @@ (syntax: #export (:by_example {type_vars ..type_parameters} {exemplar ..typed} - {extraction <c>.any}) + {extraction <code>.any}) (wrap (list (` (:of ((~! :share) [(~+ (list\map code.local_identifier type_vars))] |