aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux/type.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/lux/type.lux')
-rw-r--r--stdlib/source/lux/type.lux43
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))]