diff options
Diffstat (limited to 'source/lux/data/list.lux')
-rw-r--r-- | source/lux/data/list.lux | 344 |
1 files changed, 0 insertions, 344 deletions
diff --git a/source/lux/data/list.lux b/source/lux/data/list.lux deleted file mode 100644 index 6bf050228..000000000 --- a/source/lux/data/list.lux +++ /dev/null @@ -1,344 +0,0 @@ -## Copyright (c) Eduardo Julian. All rights reserved. -## This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. -## If a copy of the MPL was not distributed with this file, -## You can obtain one at http://mozilla.org/MPL/2.0/. - -(;import lux - (lux (control (monoid #as m #refer #all) - (functor #as F #refer #all) - (monad #as M #refer #all) - (eq #as E) - (ord #as O) - (fold #as f)) - (data (number (int #open ("i:" Int/Number Int/Ord Int/Show))) - bool - (text #open ("text:" Text/Monoid)) - tuple) - codata/function)) - -## [Types] -## (deftype (List a) -## (| #Nil -## (#Cons (, a (List a))))) - -## [Functions] -(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'))))) - -(open List/Fold) - -(def #export (fold mon xs) - (All [a] - (-> (m;Monoid a) (List a) a)) - (using mon - (foldL ++ unit xs))) - -(def #export (reverse xs) - (All [a] - (-> (List a) (List a))) - (foldL (lambda [tail head] (#;Cons [head tail])) - #;Nil - xs)) - -(def #export (filter p xs) - (All [a] - (-> (-> a Bool) (List a) (List a))) - (case xs - #;Nil - #;Nil - - (#;Cons [x xs']) - (if (p x) - (#;Cons [x (filter p xs')]) - (filter p xs')))) - -(def #export (partition p xs) - (All [a] (-> (-> a Bool) (List a) (, (List a) (List a)))) - [(filter p xs) (filter (comp p) xs)]) - -(def #export (as-pairs xs) - (All [a] (-> (List a) (List (, a a)))) - (case xs - (\ (#;Cons [x1 (#;Cons [x2 xs'])])) - (#;Cons [[x1 x2] (as-pairs xs')]) - - _ - #;Nil)) - -(do-template [<name> <then> <else>] - [(def #export (<name> n xs) - (All [a] - (-> Int (List a) (List a))) - (if (i:> n 0) - (case xs - #;Nil - #;Nil - - (#;Cons [x xs']) - <then>) - <else>))] - - [take (#;Cons [x (take (i:+ -1 n) xs')]) #;Nil] - [drop (drop (i:+ -1 n) xs') xs] - ) - -(do-template [<name> <then> <else>] - [(def #export (<name> p xs) - (All [a] - (-> (-> a Bool) (List a) (List a))) - (case xs - #;Nil - #;Nil - - (#;Cons [x xs']) - (if (p x) - <then> - <else>)))] - - [take-while (#;Cons [x (take-while p xs')]) #;Nil] - [drop-while (drop-while p xs') xs] - ) - -(def #export (split n xs) - (All [a] - (-> Int (List a) (, (List a) (List a)))) - (if (i:> n 0) - (case xs - #;Nil - [#;Nil #;Nil] - - (#;Cons [x xs']) - (let [[tail rest] (split (i:+ -1 n) xs')] - [(#;Cons [x tail]) rest])) - [#;Nil xs])) - -(def (split-with' p ys xs) - (All [a] - (-> (-> a Bool) (List a) (List a) (, (List a) (List a)))) - (case xs - #;Nil - [ys xs] - - (#;Cons [x xs']) - (if (p x) - (split-with' p (#;Cons [x ys]) xs') - [ys xs]))) - -(def #export (split-with p xs) - (All [a] - (-> (-> a Bool) (List a) (, (List a) (List a)))) - (let [[ys' xs'] (split-with' p #;Nil xs)] - [(reverse ys') xs'])) - -(def #export (repeat n x) - (All [a] - (-> Int a (List a))) - (if (i:> n 0) - (#;Cons [x (repeat (i:+ -1 n) x)]) - #;Nil)) - -(def #export (iterate f x) - (All [a] - (-> (-> a (Maybe a)) a (List a))) - (case (f x) - (#;Some x') - (#;Cons [x (iterate f x')]) - - #;None - (#;Cons [x #;Nil]))) - -(def #export (some f xs) - (All [a b] - (-> (-> a (Maybe b)) (List a) (Maybe b))) - (case xs - #;Nil - #;None - - (#;Cons [x xs']) - (case (f x) - #;None - (some f xs') - - (#;Some y) - (#;Some y)))) - -(def #export (interpose sep xs) - (All [a] - (-> a (List a) (List a))) - (case xs - #;Nil - xs - - (#;Cons [x #;Nil]) - xs - - (#;Cons [x xs']) - (#;Cons [x (#;Cons [sep (interpose sep xs')])]))) - -(def #export (size list) - (All [a] (-> (List a) Int)) - (foldL (lambda [acc _] (i:+ 1 acc)) 0 list)) - -(do-template [<name> <init> <op>] - [(def #export (<name> p xs) - (All [a] - (-> (-> a Bool) (List a) Bool)) - (foldL (lambda [_1 _2] (<op> _1 (p _2))) <init> xs))] - - [every? true and] - [any? false or]) - -(def #export (@ i xs) - (All [a] - (-> Int (List a) (Maybe a))) - (case xs - #;Nil - #;None - - (#;Cons [x xs']) - (if (i:= 0 i) - (#;Some x) - (@ (i:+ -1 i) xs')))) - -## [Syntax] -(defmacro #export (@list xs state) - (#;Right state (#;Cons (foldL (: (-> AST AST AST) - (lambda [tail head] (` (#;Cons (~ head) (~ tail))))) - (` #;Nil) - (reverse xs)) - #;Nil))) - -(defmacro #export (@list& xs state) - (case (reverse xs) - (#;Cons last init) - (#;Right state (@list (foldL (: (-> AST AST AST) - (lambda [tail head] (` (#;Cons (~ head) (~ tail))))) - last - init))) - - _ - (#;Left "Wrong syntax for @list&"))) - -## [Structures] -(defstruct #export (List/Eq eq) - (All [a] (-> (E;Eq a) (E;Eq (List a)))) - (def (= xs ys) - (case [xs ys] - [#;Nil #;Nil] - true - - [(#;Cons x xs') (#;Cons y ys')] - (and (:: eq (= x y)) - (= xs' ys')) - - [_ _] - false - ))) - -(defstruct #export List/Monoid (All [a] - (Monoid (List a))) - (def unit #;Nil) - (def (++ xs ys) - (case xs - #;Nil ys - (#;Cons x xs') (#;Cons x (++ xs' ys))))) - -(defstruct #export List/Functor (Functor List) - (def (map f ma) - (case ma - #;Nil #;Nil - (#;Cons a ma') (#;Cons (f a) (map f ma'))))) - -(defstruct #export List/Monad (Monad List) - (def _functor List/Functor) - - (def (wrap a) - (#;Cons a #;Nil)) - - (def (join mma) - (using List/Monoid - (foldL ++ unit mma)))) - -## [Functions] -(def #export (sort ord xs) - (All [a] (-> (O;Ord a) (List a) (List a))) - (case xs - #;Nil - #;Nil - - (#;Cons x xs') - (using ord - (let [pre (filter (>= x) xs') - post (filter (< x) xs') - ++ (:: List/Monoid ++)] - ($ ++ (sort ord pre) (@list x) (sort ord post)))))) - -## [Syntax] -(def (symbol$ name) - (-> Text AST) - [["" -1 -1] (#;SymbolS "" name)]) - -(def (range from to) - (-> Int Int (List Int)) - (if (i:<= from to) - (@list& from (range (i:+ 1 from) to)) - (@list))) - -(defmacro #export (zip tokens state) - (case tokens - (\ (@list [_ (#;IntS num-lists)])) - (if (i:> num-lists 0) - (using List/Functor - (let [indices (range 0 (i:- num-lists 1)) - type-vars (: (List AST) (map (. symbol$ i:show) indices)) - zip-type (` (All [(~@ type-vars)] - (-> (~@ (map (: (-> AST AST) (lambda [var] (` (List (~ var))))) - type-vars)) - (List (, (~@ type-vars)))))) - vars+lists (map (lambda [idx] - (let [base (text:++ "_" (i:show idx))] - [(symbol$ base) - (symbol$ (text:++ base "s"))])) - indices) - pattern (` [(~@ (map (lambda [[v vs]] (` (#;Cons (~ v) (~ vs)))) - vars+lists))]) - g!step (symbol$ "\tstep\t") - g!blank (symbol$ "\t_\t") - list-vars (map second vars+lists) - code (` (: (~ zip-type) - (lambda (~ g!step) [(~@ list-vars)] - (case [(~@ list-vars)] - (~ pattern) - (#;Cons [(~@ (map first vars+lists))] - ((~ g!step) (~@ list-vars))) - - (~ g!blank) - #;Nil))))] - (#;Right [state (@list code)]))) - (#;Left "Can't zip no lists.")) - - _ - (#;Left "Wrong syntax for zip"))) - -(def #export zip2 (zip 2)) -(def #export zip3 (zip 3)) - -(def #export (empty? xs) - (All [a] (-> (List a) Bool)) - (case xs - #;Nil true - _ false)) |