diff options
Diffstat (limited to 'stdlib/source/library/lux/data/collection/tree/zipper.lux')
-rw-r--r-- | stdlib/source/library/lux/data/collection/tree/zipper.lux | 188 |
1 files changed, 95 insertions, 93 deletions
diff --git a/stdlib/source/library/lux/data/collection/tree/zipper.lux b/stdlib/source/library/lux/data/collection/tree/zipper.lux index 60c11d032..767365e6f 100644 --- a/stdlib/source/library/lux/data/collection/tree/zipper.lux +++ b/stdlib/source/library/lux/data/collection/tree/zipper.lux @@ -46,7 +46,7 @@ (def: .public (zipper tree) (All (_ a) (-> (Tree a) (Zipper a))) - [#family #.None + [#family {.#None} #node tree]) (def: .public tree @@ -55,19 +55,19 @@ (def: .public value (All (_ a) (-> (Zipper a) a)) - (value@ [#node #//.value])) + (value@ [#node //.#value])) (def: .public (set value zipper) (All (_ a) (-> a (Zipper a) (Zipper a))) - (with@ [#node #//.value] value zipper)) + (with@ [#node //.#value] value zipper)) (def: .public (update transform zipper) (All (_ a) (-> (-> a a) (Zipper a) (Zipper a))) - (revised@ [#node #//.value] transform zipper)) + (revised@ [#node //.#value] transform zipper)) (def: children (All (_ a) (-> (Zipper a) (List (Tree a)))) - (value@ [#node #//.children])) + (value@ [#node //.#children])) (def: .public leaf? (All (_ a) (-> (Zipper a) Bit)) @@ -80,7 +80,7 @@ (def: .public (start? zipper) (All (_ a) (-> (Zipper a) Bit)) (case (value@ #family zipper) - #.None + {.#None} true _ @@ -89,12 +89,12 @@ (def: .public (down zipper) (All (_ a) (-> (Zipper a) (Maybe (Zipper a)))) (case (..children zipper) - #.End - #.None + {.#End} + {.#None} - {#.Item head tail} - {#.Some [#family {#.Some [#parent (with@ [#node #//.children] (list) zipper) - #lefts #.End + {.#Item head tail} + {.#Some [#family {.#Some [#parent (with@ [#node //.#children] (list) zipper) + #lefts {.#End} #rights tail]} #node head]})) @@ -106,64 +106,64 @@ (for [@.old (revised@ #node (: (-> (Tree (:parameter 0)) (Tree (:parameter 0))) - (with@ #//.children (list\composite (list.reversed lefts) - {#.Item (value@ #node zipper) - rights}))) - parent)] - (with@ [#node #//.children] - (list\composite (list.reversed lefts) - {#.Item (value@ #node zipper) - rights}) - parent)))))) + (with@ //.#children (list\composite (list.reversed #lefts) + {.#Item (value@ #node zipper) + #rights}))) + #parent)] + (with@ [#node //.#children] + (list\composite (list.reversed #lefts) + {.#Item (value@ #node zipper) + #rights}) + #parent)))))) (template [<one> <all> <side> <op_side>] [(def: .public (<one> zipper) (All (_ a) (-> (Zipper a) (Maybe (Zipper a)))) (case (value@ #family zipper) - {#.Some family} + {.#Some family} (case (value@ <side> family) - {#.Item next side'} - {#.Some (for [@.old - [#family {#.Some (|> family + {.#Item next side'} + {.#Some (for [@.old + [#family {.#Some (|> family (with@ <side> side') - (revised@ <op_side> (|>> {#.Item (value@ #node zipper)})))} + (revised@ <op_side> (|>> {.#Item (value@ #node zipper)})))} #node next]] (let [move (: (All (_ a) (-> (List (Tree a)) (Zipper a) (Family Zipper a) (Family Zipper a))) (function (_ side' zipper) (|>> (with@ <side> side') - (revised@ <op_side> (|>> {#.Item (value@ #node zipper)})))))] - [#family {#.Some (move side' zipper family)} + (revised@ <op_side> (|>> {.#Item (value@ #node zipper)})))))] + [#family {.#Some (move side' zipper family)} #node next]))} - #.End - #.None) + {.#End} + {.#None}) - #.None - #.None)) + {.#None} + {.#None})) (def: .public (<all> zipper) (All (_ a) (-> (Zipper a) (Maybe (Zipper a)))) (case (value@ #family zipper) - #.None - #.None + {.#None} + {.#None} - {#.Some family} + {.#Some family} (case (list.reversed (value@ <side> family)) - #.End - #.None + {.#End} + {.#None} - {#.Item last prevs} - {#.Some (for [@.old [#family {#.Some (|> family - (with@ <side> #.End) - (revised@ <op_side> (|>> {#.Item (value@ #node zipper)} + {.#Item last prevs} + {.#Some (for [@.old [#family {.#Some (|> family + (with@ <side> {.#End}) + (revised@ <op_side> (|>> {.#Item (value@ #node zipper)} (list\composite prevs))))} #node last]] (let [move (: (All (_ a) (-> (List (Tree a)) (Zipper a) (Family Zipper a) (Family Zipper a))) (function (_ prevs zipper) - (|>> (with@ <side> #.End) - (revised@ <op_side> (|>> {#.Item (value@ #node zipper)} + (|>> (with@ <side> {.#End}) + (revised@ <op_side> (|>> {.#Item (value@ #node zipper)} (list\composite prevs))))))] - [#family {#.Some (move prevs zipper family)} + [#family {.#Some (move prevs zipper family)} #node last]))})))] [right rightmost #rights #lefts] @@ -173,16 +173,16 @@ (def: .public (next zipper) (All (_ a) (-> (Zipper a) (Maybe (Zipper a)))) (case (..down zipper) - {#.Some forward} - {#.Some forward} + {.#Some forward} + {.#Some forward} - #.None + {.#None} (loop [@ zipper] (case (..right @) - {#.Some forward} - {#.Some forward} + {.#Some forward} + {.#Some forward} - #.None + {.#None} (do maybe.monad [@ (..up @)] (recur @)))))) @@ -190,45 +190,45 @@ (def: (bottom zipper) (All (_ a) (-> (Zipper a) (Zipper a))) (case (..right zipper) - {#.Some forward} + {.#Some forward} (bottom forward) - #.None + {.#None} (case (..down zipper) - {#.Some forward} + {.#Some forward} (bottom forward) - #.None + {.#None} zipper))) (def: .public (previous zipper) (All (_ a) (-> (Zipper a) (Maybe (Zipper a)))) (case (..left zipper) - #.None + {.#None} (..up zipper) - {#.Some backward} - {#.Some (case (..down backward) - {#.Some then} + {.#Some backward} + {.#Some (case (..down backward) + {.#Some then} (..bottom then) - #.None + {.#None} backward)})) (template [<name> <move>] [(def: .public (<name> zipper) (All (_ a) (-> (Zipper a) (Maybe (Zipper a)))) (case (<move> zipper) - #.None - #.None + {.#None} + {.#None} - {#.Some @} + {.#Some @} (loop [@ @] (case (<move> @) - #.None - {#.Some @} + {.#None} + {.#Some @} - {#.Some @} + {.#Some @} (recur @)))))] [end ..next] @@ -238,22 +238,22 @@ (def: .public (end? zipper) (All (_ a) (-> (Zipper a) Bit)) (case (..end zipper) - #.None + {.#None} true - {#.Some _} + {.#Some _} false)) (def: .public (interpose value zipper) (All (_ a) (-> a (Zipper a) (Zipper a))) - (revised@ [#node #//.children] + (revised@ [#node //.#children] (|>> (//.branch value) list) zipper)) (def: .public (adopt value zipper) (All (_ a) (-> a (Zipper a) (Zipper a))) - (revised@ [#node #//.children] - (|>> {#.Item (//.leaf value)}) + (revised@ [#node //.#children] + (|>> {.#Item (//.leaf value)}) zipper)) (def: .public (remove zipper) @@ -261,28 +261,28 @@ (do maybe.monad [family (value@ #family zipper)] (case (value@ #lefts family) - #.End - (in (with@ [#node #//.children] + {.#End} + (in (with@ [#node //.#children] (value@ #rights family) (value@ #parent family))) - {#.Item next side} + {.#Item next side} (in (|> zipper (with@ #family (|> family (with@ #lefts side) - #.Some)) + {.#Some})) (with@ #node next)))))) (template [<name> <side>] [(def: .public (<name> value zipper) (All (_ a) (-> a (Zipper a) (Maybe (Zipper a)))) (case (value@ #family zipper) - #.None - #.None + {.#None} + {.#None} - {#.Some family} - {#.Some (with@ #family - {#.Some (revised@ <side> (|>> {#.Item (//.leaf value)}) family)} + {.#Some family} + {.#Some (with@ #family + {.#Some (revised@ <side> (|>> {.#Item (//.leaf value)}) family)} zipper)}))] [insert_left #lefts] @@ -294,29 +294,31 @@ (def: (each f (^slots [#family #node])) [#family (maybe\each (function (_ (^slots [#parent #lefts #rights])) - [#parent (each f parent) - #lefts (list\each (//\each f) lefts) - #rights (list\each (//\each f) rights)]) - family) - #node (//\each f node)])) + [#parent (each f #parent) + #lefts (list\each (//\each f) #lefts) + #rights (list\each (//\each f) #rights)]) + #family) + #node (//\each f #node)])) (implementation: .public comonad (CoMonad Zipper) - (def: &functor ..functor) + (def: &functor + ..functor) - (def: out (value@ [#node #//.value])) + (def: out + (value@ [#node //.#value])) (def: (disjoint (^slots [#family #node])) (let [tree_splitter (: (All (_ a) (-> (Tree a) (Tree (Zipper a)))) (function (tree_splitter tree) - [#//.value (..zipper tree) - #//.children (|> tree - (value@ #//.children) + [//.#value (..zipper tree) + //.#children (|> tree + (value@ //.#children) (list\each tree_splitter))]))] [#family (maybe\each (function (_ (^slots [#parent #lefts #rights])) - [#parent (disjoint parent) - #lefts (list\each tree_splitter lefts) - #rights (list\each tree_splitter rights)]) - family) - #node (tree_splitter node)]))) + [..#parent (disjoint #parent) + ..#lefts (list\each tree_splitter #lefts) + ..#rights (list\each tree_splitter #rights)]) + #family) + #node (tree_splitter #node)]))) |