(.module: [library [lux #* [abstract [functor (#+ Functor)] [comonad (#+ CoMonad)]] [control ["//" continuation (#+ Cont)] ["<>" parser ["<.>" code (#+ Parser)]]] [macro (#+ with_identifiers) [syntax (#+ syntax:)] ["." code]] [data ["." bit] [collection ["." list ("#\." monad)]]] [math [number ["n" nat]]]]]) (type: .public (Sequence a) (Cont [a (Sequence a)])) (def: .public (iterations step init) (All [a b] (-> (-> a [a b]) a (Sequence b))) (let [[next x] (step init)] (//.pending [x (iterations step next)]))) (def: .public (repeated x) (All [a] (-> a (Sequence a))) (//.pending [x (repeated x)])) (def: .public (cycle [start next]) (All [a] (-> [a (List a)] (Sequence a))) (loop [head start tail next] (//.pending [head (case tail #.End (recur start next) (#.Item head' tail') (recur head' tail'))]))) (template [ ] [(def: .public ( sequence) (All [a] (-> (Sequence a) )) (let [[head tail] (//.result sequence)] ))] [head a] [tail (Sequence a)] ) (def: .public (item idx sequence) (All [a] (-> Nat (Sequence a) a)) (let [[head tail] (//.result sequence)] (case idx 0 head _ (item (-- idx) tail)))) (template [ ] [(def: .public ( pred xs) (All [a] (-> (Sequence a) (List a))) (let [[x xs'] (//.result xs)] (if ( ) (list& x ( xs')) (list)))) (def: .public ( pred xs) (All [a] (-> (Sequence a) (Sequence a))) (let [[x xs'] (//.result xs)] (if ( ) ( xs') xs)))] [while until (-> a Bit) (pred x) pred |>] [first after Nat (n.= 0 pred) (-- pred) not] ) (template [ ] [(def: .public ( pred xs) (All [a] (-> (Sequence a) [(List a) (Sequence a)])) (let [[x xs'] (//.result xs)] (if [(list) xs] (let [[tail next] ( xs')] [(#.Item [x tail]) next]))))] [split_when (-> a Bit) (pred x) pred] [split_at Nat (n.= 0 pred) (-- pred)] ) (def: .public (only predicate sequence) (All [a] (-> (-> a Bit) (Sequence a) (Sequence a))) (let [[head tail] (//.result sequence)] (if (predicate head) (//.pending [head (only predicate tail)]) (only predicate tail)))) (def: .public (partition left? xs) (All [a] (-> (-> a Bit) (Sequence a) [(Sequence a) (Sequence a)])) [(..only left? xs) (..only (bit.complement left?) xs)]) (implementation: .public functor (Functor Sequence) (def: (map f fa) (let [[head tail] (//.result fa)] (//.pending [(f head) (map f tail)])))) (implementation: .public comonad (CoMonad Sequence) (def: &functor ..functor) (def: out head) (def: (split wa) (let [[head tail] (//.result wa)] (//.pending [wa (split tail)])))) (syntax: .public (^sequence& [patterns (.form (<>.many .any)) body .any branches (<>.some .any)]) (with_identifiers [g!sequence] (let [body+ (` (let [(~+ (list\join (list\map (function (_ pattern) (list (` [(~ pattern) (~ g!sequence)]) (` ((~! //.result) (~ g!sequence))))) patterns)))] (~ body)))] (in (list& g!sequence body+ branches)))))