aboutsummaryrefslogtreecommitdiff
path: root/source/lux/data/list.lux
diff options
context:
space:
mode:
Diffstat (limited to 'source/lux/data/list.lux')
-rw-r--r--source/lux/data/list.lux88
1 files changed, 84 insertions, 4 deletions
diff --git a/source/lux/data/list.lux b/source/lux/data/list.lux
index 489ac5b4f..b2049d419 100644
--- a/source/lux/data/list.lux
+++ b/source/lux/data/list.lux
@@ -8,7 +8,8 @@
(functor #as F #refer #all)
(monad #as M #refer #all)
(eq #as E)
- (ord #as O))
+ (ord #as O)
+ (fold #as f))
(data (number (int #open ("i" Int/Number Int/Ord)))
bool)
meta/macro))
@@ -39,6 +40,23 @@
(#;Cons [x xs'])
(f x (foldR f init xs'))))
+(defstruct #export List/Fold (f;Fold List)
+ (def (foldL f init xs)
+ (case xs
+ #;Nil
+ init
+
+ (#;Cons [x xs'])
+ (foldL f (f init x) xs')))
+
+ (def (foldR f init xs)
+ (case xs
+ #;Nil
+ init
+
+ (#;Cons [x xs'])
+ (f x (foldR f init xs')))))
+
(def #export (fold mon xs)
(All [a]
(-> (m;Monoid a) (List a) a))
@@ -224,13 +242,75 @@
(case (reverse xs)
(#;Cons last init)
(#;Right state (@list (foldL (: (-> AST AST AST)
- (lambda [tail head] (` (#;Cons (~ head) (~ tail)))))
- last
- init)))
+ (lambda [tail head] (` (#;Cons (~ head) (~ tail)))))
+ last
+ init)))
_
(#;Left "Wrong syntax for @list&")))
+## (defmacro #export (zip tokens state)
+## (if (i> (size tokens) 0)
+## (using List/Functor
+## (let [indices (range 0 (i+ 1 (size tokens)))
+## vars+lists (map (lambda [idx]
+## (let [base (text:++ "_" idx)]
+## [[["" -1 -1] (#SymbolS "" base)]
+## [["" -1 -1] (#SymbolS "" (text:++ base "s"))]]))
+## indices)
+## pattern (` [(~@ (map (lambda [[v vs]] (` (#;Cons (~ v) (~ vs))))
+## vars+lists))])
+## g!step [["" -1 -1] (#SymbolS "" "\tstep\t")]
+## g!arg [["" -1 -1] (#SymbolS "" "\targ\t")]
+## g!blank [["" -1 -1] (#SymbolS "" "\t_\t")]
+## code (` ((lambda (~ g!step) [(~ g!arg)]
+## (case (~ g!arg)
+## (~ pattern)
+## (#;Cons [(~@ vars)] ((~ g!step) [(~ (map second vars))]))
+
+## (~ g!blank)
+## #;Nil))
+## [(~@ tokens)]))]
+## (#;Right state (@list code))))
+## (#;Left "Can't zip no lists.")))
+
+## (defmacro #export (zip-with tokens state)
+## (case tokens
+## (@list& _f tokens)
+## (case _f
+## [_ (#;SymbolS _)]
+## (if (i> (size tokens) 0)
+## (using List/Functor
+## (let [indices (range 0 (i+ 1 (size tokens)))
+## vars+lists (map (lambda [idx]
+## (let [base (text:++ "_" idx)]
+## [[["" -1 -1] (#SymbolS "" base)]
+## [["" -1 -1] (#SymbolS "" (text:++ base "s"))]]))
+## indices)
+## pattern (` [(~@ (map (lambda [[v vs]] (` (#;Cons (~ v) (~ vs))))
+## vars+lists))])
+## g!step [["" -1 -1] (#SymbolS "" "\tstep\t")]
+## g!arg [["" -1 -1] (#SymbolS "" "\targ\t")]
+## g!blank [["" -1 -1] (#SymbolS "" "\t_\t")]
+## code (` ((lambda (~ g!step) [(~ g!arg)]
+## (case (~ g!arg)
+## (~ pattern)
+## (#;Cons ((~ _f) (~@ vars)) ((~ g!step) [(~ (map second vars))]))
+
+## (~ g!blank)
+## #;Nil))
+## [(~@ tokens)]))]
+## (#;Right state (@list code))))
+## (#;Left "Can't zip-with no lists."))
+
+## _
+## (let [g!temp [["" -1 -1] (#SymbolS "" "\ttemp\t")]]
+## (#;Right state (@list (` (let [(~ g!temp) (~ _f)]
+## (;;zip-with (~@ (@list& g!temp tokens)))))))))
+
+## _
+## (#;Left "Wrong syntax for zip-with")))
+
## [Structures]
## (defstruct #export (List/Eq eq) (All [a] (-> (Eq a) (Eq (List a))))
## (def (= xs ys)