diff options
Diffstat (limited to 'stdlib/source')
96 files changed, 1227 insertions, 457 deletions
diff --git a/stdlib/source/documentation/lux.lux b/stdlib/source/documentation/lux.lux new file mode 100644 index 000000000..5131a9607 --- /dev/null +++ b/stdlib/source/documentation/lux.lux @@ -0,0 +1,31 @@ +(.module: + [library + [lux + [program (#+ program:)] + ["$" documentation (#+ documentation:)] + ["." debug] + [control + ["." io]]]] + [\\library + ["." /]] + ["." / #_ + ["#." abstract]]) + +(documentation: /.:of + "Generates the type corresponding to a given expression." + [(let [my_num +123] + (:of my_num)) + "=>" + .Int] + [(:of +123) + "=>" + .Int]) + +(.def: .public documentation + (.List $.Module) + ($.module /._ + [..:of] + [/abstract.documentation])) + +(program: inputs + (io.io (debug.log! ($.documentation ..documentation)))) diff --git a/stdlib/source/documentation/lux/abstract.lux b/stdlib/source/documentation/lux/abstract.lux new file mode 100644 index 000000000..a4e7ec807 --- /dev/null +++ b/stdlib/source/documentation/lux/abstract.lux @@ -0,0 +1,42 @@ +(.module: + [library + [lux #* + ["$" documentation (#+ documentation:)] + [data + [text (#+ \n) + ["%" format (#+ format)]] + [collection + ["." list]]]]] + ["." / #_ + ["#." apply] + ["#." codec] + ["#." comonad] + ["#." enum] + ["#." equivalence] + ... ["#." hash] + ... ["#." fold] + ["#." functor] + ... ["#." interval] + ["#." monad] + ... ["#." monoid] + ... ["#." order] + ... ["#." predicate] + ]) + +(.def: .public documentation + (.List $.Module) + (list.joined (list + /apply.documentation + /codec.documentation + /comonad.documentation + /enum.documentation + /equivalence.documentation + ... /hash.documentation + ... /fold.documentation + ... /interval.documentation + ... /monoid.documentation + ... /order.documentation + ... /predicate.documentation + /functor.documentation + /monad.documentation + ))) diff --git a/stdlib/source/documentation/lux/abstract/apply.lux b/stdlib/source/documentation/lux/abstract/apply.lux new file mode 100644 index 000000000..ba611918d --- /dev/null +++ b/stdlib/source/documentation/lux/abstract/apply.lux @@ -0,0 +1,19 @@ +(.module: + [library + [lux + ["$" documentation (#+ documentation:)]]] + [\\library + ["." /]]) + +(documentation: /.Apply + "Applicative functors.") + +(documentation: /.compose + "Applicative functor composition.") + +(.def: .public documentation + (.List $.Module) + ($.module /._ + [..Apply + ..compose] + [])) diff --git a/stdlib/source/documentation/lux/abstract/codec.lux b/stdlib/source/documentation/lux/abstract/codec.lux new file mode 100644 index 000000000..dc83d6fce --- /dev/null +++ b/stdlib/source/documentation/lux/abstract/codec.lux @@ -0,0 +1,24 @@ +(.module: + [library + [lux + ["$" documentation (#+ documentation:)]]] + [\\library + ["." /]]) + +(documentation: /.Codec + "A way to move back-and-forth between a type and an alternative representation for it.") + +(documentation: /.compose + "Codec composition." + [(: (Codec c a) + (compose (: (Codec c b) + cb_codec) + (: (Codec b a) + ba_codec)))]) + +(.def: .public documentation + (.List $.Module) + ($.module /._ + [..Codec + ..compose] + [])) diff --git a/stdlib/source/documentation/lux/abstract/comonad.lux b/stdlib/source/documentation/lux/abstract/comonad.lux new file mode 100644 index 000000000..10f39e86d --- /dev/null +++ b/stdlib/source/documentation/lux/abstract/comonad.lux @@ -0,0 +1,29 @@ +(.module: + [library + [lux + ["$" documentation (#+ documentation:)] + [data + [text (#+ \n) + ["%" format (#+ format)]]]]] + [\\library + ["." /]] + ["." / #_ + ["#." cofree]]) + +(documentation: /.CoMonad + (format "Co-monads are the opposite/complement to monads." + \n "Co-monadic structures are often infinite in size and built upon lazily-evaluated functions.")) + +(documentation: /.be + "A co-monadic parallel to the 'do' macro." + [(let [square (function (_ n) (* n n))] + (be comonad + [inputs (iterate inc +2)] + (square (out inputs))))]) + +(.def: .public documentation + (.List $.Module) + ($.module /._ + [..CoMonad + ..be] + [/cofree.documentation])) diff --git a/stdlib/source/documentation/lux/abstract/comonad/cofree.lux b/stdlib/source/documentation/lux/abstract/comonad/cofree.lux new file mode 100644 index 000000000..332cae864 --- /dev/null +++ b/stdlib/source/documentation/lux/abstract/comonad/cofree.lux @@ -0,0 +1,17 @@ +(.module: + [library + [lux + ["$" documentation (#+ documentation:)]]] + [\\library + ["." /]]) + +(documentation: /.CoFree + "The CoFree CoMonad.") + +(.def: .public documentation + (.List $.Module) + ($.module /._ + [..CoFree + ($.default /.functor) + ($.default /.comonad)] + [])) diff --git a/stdlib/source/documentation/lux/abstract/enum.lux b/stdlib/source/documentation/lux/abstract/enum.lux new file mode 100644 index 000000000..2853ba8ca --- /dev/null +++ b/stdlib/source/documentation/lux/abstract/enum.lux @@ -0,0 +1,20 @@ +(.module: + [library + [lux + ["$" documentation (#+ documentation:)]]] + [\\library + ["." /]]) + +(documentation: /.Enum + "Enumerable types, with a notion of moving forward and backwards through a type's instances.") + +(documentation: /.range + "An inclusive [from, to] range of values." + [(range enum from to)]) + +(.def: .public documentation + (.List $.Module) + ($.module /._ + [..Enum + ..range] + [])) diff --git a/stdlib/source/documentation/lux/abstract/equivalence.lux b/stdlib/source/documentation/lux/abstract/equivalence.lux new file mode 100644 index 000000000..0be66e537 --- /dev/null +++ b/stdlib/source/documentation/lux/abstract/equivalence.lux @@ -0,0 +1,24 @@ +(.module: + [library + [lux + ["$" documentation (#+ documentation:)] + [data + [text (#+ \n) + ["%" format (#+ format)]]]]] + [\\library + ["." /]]) + +(documentation: /.Equivalence + "Equivalence for a type's instances.") + +(documentation: /.rec + "A recursive equivalence combinator." + [(rec recursive_equivalence)]) + +(.def: .public documentation + (.List $.Module) + ($.module /._ + [..Equivalence + ..rec + ($.default /.functor)] + [])) diff --git a/stdlib/source/documentation/lux/abstract/functor.lux b/stdlib/source/documentation/lux/abstract/functor.lux new file mode 100644 index 000000000..1ca3b082a --- /dev/null +++ b/stdlib/source/documentation/lux/abstract/functor.lux @@ -0,0 +1,33 @@ +(.module: + [library + [lux + ["$" documentation (#+ documentation:)] + [data + [text (#+ \n) + ["%" format (#+ format)]]]]] + [\\library + ["." /]] + ["." / #_ + ["#." contravariant]]) + +(documentation: /.sum + "Co-product (sum) composition for functors.") + +(documentation: /.product + "Product composition for functors.") + +(documentation: /.compose + "Functor composition.") + +(.def: .public documentation + (.List $.Module) + ($.module /._ + [($.default /.Functor) + ($.default /.Fix) + ($.default /.Or) + ($.default /.And) + ($.default /.Then) + ..sum + ..product + ..compose] + [/contravariant.documentation])) diff --git a/stdlib/source/documentation/lux/abstract/functor/contravariant.lux b/stdlib/source/documentation/lux/abstract/functor/contravariant.lux new file mode 100644 index 000000000..15f2332ed --- /dev/null +++ b/stdlib/source/documentation/lux/abstract/functor/contravariant.lux @@ -0,0 +1,15 @@ +(.module: + [library + [lux + ["$" documentation (#+ documentation:)]]] + [\\library + ["." /]]) + +(documentation: /.Functor + "The contravariant functor.") + +(.def: .public documentation + (.List $.Module) + ($.module /._ + [..Functor] + [])) diff --git a/stdlib/source/documentation/lux/abstract/monad.lux b/stdlib/source/documentation/lux/abstract/monad.lux new file mode 100644 index 000000000..7293f9a1d --- /dev/null +++ b/stdlib/source/documentation/lux/abstract/monad.lux @@ -0,0 +1,54 @@ +(.module: + [library + [lux + ["$" documentation (#+ documentation:)] + [data + [text (#+ \n) + ["%" format (#+ format)]]]]] + [\\library + ["." /]] + ["." / #_ + ["#." free]]) + +(documentation: /.Monad + (format "A monad is a monoid in the category of endofunctors." + \n "What's the problem?")) + +(documentation: /.do + "Macro for easy concatenation of monadic operations." + [(do monad + [y (f1 x) + z (f2 z)] + (in (f3 z)))]) + +(documentation: /.bind + "Apply a function with monadic effects to a monadic value and yield a new monadic value." + [(bind monad function)]) + +(documentation: /.seq + "Run all the monadic values in the list and produce a list of the base values." + [(seq monad)]) + +(documentation: /.map + "Apply a monadic function to all values in a list." + [(map monad function items)]) + +(documentation: /.only + "Filter the values in a list with a monadic function." + [(only monad predicate items)]) + +(documentation: /.fold + "Fold a list with a monadic function." + [(fold monad function initial_value items)]) + +(.def: .public documentation + (.List $.Module) + ($.module /._ + [..Monad + ..do + ..bind + ..seq + ..map + ..only + ..fold] + [/free.documentation])) diff --git a/stdlib/source/documentation/lux/abstract/monad/free.lux b/stdlib/source/documentation/lux/abstract/monad/free.lux new file mode 100644 index 000000000..c29516a1c --- /dev/null +++ b/stdlib/source/documentation/lux/abstract/monad/free.lux @@ -0,0 +1,18 @@ +(.module: + [library + [lux + ["$" documentation (#+ documentation:)]]] + [\\library + ["." /]]) + +(documentation: /.Free + "The Free Monad.") + +(.def: .public documentation + (.List $.Module) + ($.module /._ + [..Free + ($.default /.functor) + ($.default /.apply) + ($.default /.monad)] + [])) diff --git a/stdlib/source/library/lux.lux b/stdlib/source/library/lux.lux index 16123c586..f534a51d9 100644 --- a/stdlib/source/library/lux.lux +++ b/stdlib/source/library/lux.lux @@ -2496,10 +2496,11 @@ [(def:''' .private (<name> xy) #End (All [a b] (-> (Tuple a b) <type>)) - (let' [[x y] xy] <value>))] + (let' [[x y] xy] + <value>))] - [first a x] - [second b y]) + [product\left a x] + [product\right b y]) (def:''' .private (type_declaration type_codes) #End @@ -2516,8 +2517,8 @@ (failure "Wrong syntax for variant case.")} pair))) pairs)] - (in_meta [(` (Tuple (~+ (list\map second members)))) - (#Some (list\map first members))])) + (in_meta [(` (Tuple (~+ (list\map product\right members)))) + (#Some (list\map product\left members))])) (#Item type #End) ({[_ (#Tag "" member_name)] @@ -2548,8 +2549,8 @@ (failure "Wrong syntax for variant case.")} case))) (list& case cases))] - (in_meta [(` (..Variant (~+ (list\map second members)))) - (#Some (list\map first members))])) + (in_meta [(` (..Variant (~+ (list\map product\right members)))) + (#Some (list\map product\left members))])) _ (failure "Improper type-definition syntax")} @@ -3551,7 +3552,7 @@ _ (failure "No tags available for type."))) .let [tag_mappings (: (List [Text Code]) - (list\map (function (_ tag) [(second tag) (tag$ tag)]) + (list\map (function (_ tag) [(product\right tag) (tag$ tag)]) tags))] members (monad\map meta_monad (: (-> Code (Meta [Code Code])) @@ -5033,8 +5034,8 @@ [[_ _ column] (#Record pairs)] (list\fold n/min column - (list\compose (list\map (|>> first baseline_column) pairs) - (list\map (|>> second baseline_column) pairs))) + (list\compose (list\map (|>> product\left baseline_column) pairs) + (list\map (|>> product\right baseline_column) pairs))) )) (type: Documentation_Fragment @@ -5086,16 +5087,11 @@ (-> Location Text Location) [file line ("lux i64 +" column (text\size code_text))]) -(def: (delimiter_updated_location [file line column]) - (-> Location Location) - [file line (inc column)]) - (def: un_paired (-> (List [Code Code]) (List Code)) (let [pair_list (: (-> [Code Code] (List Code)) - (function (_ pair) - (let [[left right] pair] - (list left right))))] + (function (_ [left right]) + (list left right)))] (|>> (list\map pair_list) list\join))) @@ -5121,9 +5117,9 @@ (let [[group_location' parts_text] (list\fold (function (_ part [last_location text_accum]) (let [[part_location part_text] (example_documentation last_location baseline part)] [part_location (text\compose text_accum part_text)])) - [(delimiter_updated_location group_location) ""] + [(update@ #column inc group_location) ""] (<prep> parts))] - [(delimiter_updated_location group_location') + [(update@ #column inc group_location') ($_ text\compose (location_padding baseline prev_location group_location) <open> parts_text @@ -5136,10 +5132,6 @@ ("lux io error" "@example_documentation Undefined behavior.") )) -(def: (with_baseline baseline [file line column]) - (-> Nat Location Location) - [file line baseline]) - (def: (fragment_documentation fragment) (-> Documentation_Fragment Text) (case fragment @@ -5152,7 +5144,7 @@ (#Documentation_Example example) (let [baseline (baseline_column example) [location _] example - [_ text] (..example_documentation (with_baseline baseline location) baseline example)] + [_ text] (..example_documentation (set@ #.column baseline location) baseline example)] (text\compose text __paragraph)))) (macro: .public (example tokens) @@ -5246,8 +5238,8 @@ (case ?params (#.Some [name bindings body]) (let [pairs (pairs bindings) - vars (list\map first pairs) - inits (list\map second pairs)] + vars (list\map product\left pairs) + inits (list\map product\right pairs)] (if (every? identifier? inits) (do meta_monad [inits' (: (Meta (List Name)) diff --git a/stdlib/source/library/lux/abstract/apply.lux b/stdlib/source/library/lux/abstract/apply.lux index 051809cc0..adac4d3a2 100644 --- a/stdlib/source/library/lux/abstract/apply.lux +++ b/stdlib/source/library/lux/abstract/apply.lux @@ -6,7 +6,6 @@ ["." functor (#+ Functor)]]) (interface: .public (Apply f) - {#.doc "Applicative functors."} (: (Functor f) &functor) (: (All [a b] @@ -14,7 +13,6 @@ apply)) (implementation: .public (compose f_monad f_apply g_apply) - {#.doc "Applicative functor composition."} (All [F G] (-> (Monad F) (Apply F) (Apply G) ... TODO: Replace (All [a] (F (G a))) with (functor.Then F G) diff --git a/stdlib/source/library/lux/abstract/codec.lux b/stdlib/source/library/lux/abstract/codec.lux index bf6da6f54..0c3901361 100644 --- a/stdlib/source/library/lux/abstract/codec.lux +++ b/stdlib/source/library/lux/abstract/codec.lux @@ -8,14 +8,12 @@ ["." functor]]) (interface: .public (Codec m a) - {#.doc "A way to move back-and-forth between a type and an alternative representation for it."} (: (-> a m) encode) (: (-> m (Try a)) decode)) (implementation: .public (compose cb_codec ba_codec) - {#.doc "Codec composition."} (All [a b c] (-> (Codec c b) (Codec b a) (Codec c a))) diff --git a/stdlib/source/library/lux/abstract/comonad.lux b/stdlib/source/library/lux/abstract/comonad.lux index 6de44d5f2..8803eed86 100644 --- a/stdlib/source/library/lux/abstract/comonad.lux +++ b/stdlib/source/library/lux/abstract/comonad.lux @@ -13,8 +13,6 @@ [functor (#+ Functor)]]) (interface: .public (CoMonad w) - {#.doc (example "CoMonads are the opposite/complement to monads." - "CoMonadic structures are often infinite in size and built upon lazily-evaluated functions.")} (: (Functor w) &functor) (: (All [a] @@ -25,11 +23,6 @@ split)) (macro: .public (be tokens state) - {#.doc (example "A co-monadic parallel to the 'do' macro." - (let [square (function (_ n) (* n n))] - (be comonad - [inputs (iterate inc +2)] - (square (head inputs)))))} (case (: (Maybe [(Maybe Text) Code (List Code) Code]) (case tokens (^ (list [_ (#.Record (list [[_ (#.Identifier ["" name])] comonad]))] [_ (#.Tuple bindings)] body)) diff --git a/stdlib/source/library/lux/abstract/comonad/cofree.lux b/stdlib/source/library/lux/abstract/comonad/cofree.lux index 1431ee3cc..c5d61dbb4 100644 --- a/stdlib/source/library/lux/abstract/comonad/cofree.lux +++ b/stdlib/source/library/lux/abstract/comonad/cofree.lux @@ -6,7 +6,6 @@ [functor (#+ Functor)]]]) (type: .public (CoFree F a) - {#.doc "The CoFree CoMonad."} [a (F (CoFree F a))]) (implementation: .public (functor dsl) diff --git a/stdlib/source/library/lux/abstract/enum.lux b/stdlib/source/library/lux/abstract/enum.lux index 0cb26b8a4..bb82c2936 100644 --- a/stdlib/source/library/lux/abstract/enum.lux +++ b/stdlib/source/library/lux/abstract/enum.lux @@ -5,13 +5,11 @@ ["." order (#+ Order)]]) (interface: .public (Enum e) - {#.doc "Enumerable types, with a notion of moving forward and backwards through a type's instances."} (: (Order e) &order) (: (-> e e) succ) (: (-> e e) pred)) (def: .public (range enum from to) - {#.doc "An inclusive [from, to] range of values."} (All [a] (-> (Enum a) a a (List a))) (let [(^open "/\.") enum] (loop [end to diff --git a/stdlib/source/library/lux/abstract/equivalence.lux b/stdlib/source/library/lux/abstract/equivalence.lux index ad3e90d00..43598f09e 100644 --- a/stdlib/source/library/lux/abstract/equivalence.lux +++ b/stdlib/source/library/lux/abstract/equivalence.lux @@ -6,12 +6,10 @@ ["." contravariant]]]) (interface: .public (Equivalence a) - {#.doc "Equivalence for a type's instances."} (: (-> a a Bit) =)) (def: .public (rec sub) - {#.doc (example "A recursive equivalence combinator.")} (All [a] (-> (-> (Equivalence a) (Equivalence a)) (Equivalence a))) (implementation (def: (= left right) diff --git a/stdlib/source/library/lux/abstract/functor.lux b/stdlib/source/library/lux/abstract/functor.lux index 3d6e38883..d06f82ed7 100644 --- a/stdlib/source/library/lux/abstract/functor.lux +++ b/stdlib/source/library/lux/abstract/functor.lux @@ -15,7 +15,6 @@ (All [a] (.Or (f a) (g a)))) (def: .public (sum (^open "f\.") (^open "g\.")) - {#.doc (example "Co-product (sum) composition for functors.")} (All [F G] (-> (Functor F) (Functor G) (Functor (..Or F G)))) (implementation (def: (map f fa|ga) @@ -30,7 +29,6 @@ (All [a] (.And (f a) (g a)))) (def: .public (product (^open "f\.") (^open "g\.")) - {#.doc (example "Product composition for functors.")} (All [F G] (-> (Functor F) (Functor G) (Functor (..And F G)))) (implementation (def: (map f [fa ga]) @@ -41,7 +39,6 @@ (All [a] (f (g a)))) (def: .public (compose (^open "f\.") (^open "g\.")) - {#.doc "Functor composition."} (All [F G] (-> (Functor F) (Functor G) (Functor (..Then F G)))) (implementation (def: (map f fga) diff --git a/stdlib/source/library/lux/abstract/monad.lux b/stdlib/source/library/lux/abstract/monad.lux index 31002b5be..6ba4f74aa 100644 --- a/stdlib/source/library/lux/abstract/monad.lux +++ b/stdlib/source/library/lux/abstract/monad.lux @@ -44,9 +44,6 @@ #.End)) (interface: .public (Monad m) - {#.doc (example "A monad is a monoid in the category of endofunctors." - "What's the problem?")} - (: (Functor m) &functor) (: (All [a] @@ -57,11 +54,6 @@ join)) (macro: .public (do tokens state) - {#.doc (example "Macro for easy concatenation of monadic operations." - (do monad - [y (f1 x) - z (f2 z)] - (in (f3 z))))} (case (: (Maybe [(Maybe Text) Code (List Code) Code]) (case tokens (^ (list [_ (#.Record (list [[_ (#.Identifier ["" name])] monad]))] [_ (#.Tuple bindings)] body)) @@ -114,7 +106,6 @@ (#.Left "Wrong syntax for 'do'"))) (def: .public (bind monad f) - {#.doc (example "Apply a function with monadic effects to a monadic value and yield a new monadic value.")} (All [! a b] (-> (Monad !) (-> a (! b)) (-> (! a) (! b)))) @@ -122,7 +113,6 @@ (\ monad join))) (def: .public (seq monad) - {#.doc "Run all the monadic values in the list and produce a list of the base values."} (All [M a] (-> (Monad M) (List (M a)) (M (List a)))) @@ -139,7 +129,6 @@ !\join))))) (def: .public (map monad f) - {#.doc "Apply a monadic function to all values in a list."} (All [M a b] (-> (Monad M) (-> a (M b)) (List a) (M (List b)))) @@ -156,7 +145,6 @@ !\join))))) (def: .public (only monad f) - {#.doc "Filter the values in a list with a monadic function."} (All [! a b] (-> (Monad !) (-> a (! Bit)) (List a) (! (List a)))) @@ -177,7 +165,6 @@ !\join))))) (def: .public (fold monad f init xs) - {#.doc "Fold a list with a monadic function."} (All [M a b] (-> (Monad M) (-> b a (M a)) a (List b) (M a))) diff --git a/stdlib/source/library/lux/abstract/monad/free.lux b/stdlib/source/library/lux/abstract/monad/free.lux index d954c5581..67aa94755 100644 --- a/stdlib/source/library/lux/abstract/monad/free.lux +++ b/stdlib/source/library/lux/abstract/monad/free.lux @@ -7,7 +7,6 @@ [monad (#+ Monad)]]) (type: .public (Free F a) - {#.doc "The Free Monad."} (#Pure a) (#Effect (F (Free F a)))) diff --git a/stdlib/source/library/lux/control/concurrency/semaphore.lux b/stdlib/source/library/lux/control/concurrency/semaphore.lux index 789c0a28f..f7f4f5f50 100644 --- a/stdlib/source/library/lux/control/concurrency/semaphore.lux +++ b/stdlib/source/library/lux/control/concurrency/semaphore.lux @@ -58,7 +58,7 @@ [[_ state'] (atom.update! (|>> (update@ #open_positions dec) (if> [<had_open_position?>] [] - [(update@ #waiting_list (queue.push sink))])) + [(update@ #waiting_list (queue.end sink))])) semaphore)] (with_expansions [<go_ahead> (sink []) <get_in_line> (in false)] @@ -83,12 +83,12 @@ state (|> state (update@ #open_positions inc) - (update@ #waiting_list queue.pop)))) + (update@ #waiting_list queue.next)))) semaphore)] (if (same? pre post) (in (exception.except ..semaphore_is_maxed_out [(get@ #max_positions pre)])) (do ! - [_ (case (queue.peek (get@ #waiting_list pre)) + [_ (case (queue.front (get@ #waiting_list pre)) #.None (in true) diff --git a/stdlib/source/library/lux/control/concurrency/stm.lux b/stdlib/source/library/lux/control/concurrency/stm.lux index 7e57abc62..f3bdbcbb6 100644 --- a/stdlib/source/library/lux/control/concurrency/stm.lux +++ b/stdlib/source/library/lux/control/concurrency/stm.lux @@ -37,7 +37,7 @@ (All [a] (-> (Var a) a)) (|>> :representation atom.read! io.run! product.left)) - (def: (un_follow sink var) + (def: (un_follow! sink var) (All [a] (-> (Sink a) (Var a) (IO Any))) (do io.monad [_ (atom.update! (function (_ [value observers]) @@ -61,12 +61,12 @@ (in []) (#try.Failure _) - (un_follow sink var)))) + (un_follow! sink var)))) observers)] (in [])) (write! new_value var)))) - (def: .public (follow target) + (def: .public (follow! target) {#.doc "Creates a channel that will receive all changes to the value of the given var."} (All [a] (-> (Var a) (IO [(Channel a) (Sink a)]))) (do io.monad @@ -260,7 +260,7 @@ (in []))) ))) -(def: .public (commit stm_proc) +(def: .public (commit! stm_proc) {#.doc (example "Commits a transaction and returns its result (asynchronously)." "Note that a transaction may be re-run an indeterminate number of times if other transactions involving the same variables successfully commit first." "For this reason, it's important to note that transactions must be free from side-effects, such as I/O.")} diff --git a/stdlib/source/library/lux/control/parser/text.lux b/stdlib/source/library/lux/control/parser/text.lux index 8ca2af321..ffe6e6f27 100644 --- a/stdlib/source/library/lux/control/parser/text.lux +++ b/stdlib/source/library/lux/control/parser/text.lux @@ -39,7 +39,7 @@ (def: (remaining' offset tape) (-> Offset Text Text) - (|> tape (/.split offset) maybe.assume product.right)) + (|> tape (/.split_at offset) maybe.assume product.right)) (exception: .public (unconsumed_input {offset Offset} {tape Text}) (exception.report @@ -152,7 +152,7 @@ (#try.Success [input []]) (exception.except ..unconsumed_input input)))) -(def: .public peek +(def: .public next {#.doc "Yields the next character (without consuming it from the input)."} (Parser Text) (function (_ (^@ input [offset tape])) diff --git a/stdlib/source/library/lux/control/parser/type.lux b/stdlib/source/library/lux/control/parser/type.lux index 3dfea1a30..619526cdb 100644 --- a/stdlib/source/library/lux/control/parser/type.lux +++ b/stdlib/source/library/lux/control/parser/type.lux @@ -109,7 +109,7 @@ (#try.Success [[_ remaining] output]) (#try.Success [[env remaining] output])))) -(def: .public peek +(def: .public next {#.doc (example "Inspect a type in the input stream without consuming it.")} (Parser Type) (.function (_ [env inputs]) diff --git a/stdlib/source/library/lux/control/region.lux b/stdlib/source/library/lux/control/region.lux index d84f0e027..ba3962400 100644 --- a/stdlib/source/library/lux/control/region.lux +++ b/stdlib/source/library/lux/control/region.lux @@ -64,7 +64,7 @@ (monad.map ! (function (_ cleaner) (cleaner []))) (\ ! map (list\fold clean output))))) -(def: .public (acquire monad cleaner value) +(def: .public (acquire! monad cleaner value) {#.doc (example "Acquire a resource while pairing it a function that knows how to reclaim it.")} (All [! a] (-> (Monad !) (-> a (! (Try Any))) a (All [r] (Region r ! a)))) diff --git a/stdlib/source/library/lux/control/thread.lux b/stdlib/source/library/lux/control/thread.lux index c0a8c5955..266c12afc 100644 --- a/stdlib/source/library/lux/control/thread.lux +++ b/stdlib/source/library/lux/control/thread.lux @@ -31,7 +31,7 @@ (array.write! 0 init) :abstraction))) - (def: .public (read box) + (def: .public (read! box) {#.doc (example "Reads the current value in the box.")} (All [! a] (-> (Box ! a) (Thread ! a))) (function (_ !) @@ -53,7 +53,7 @@ @.php ("php array read" 0 (:representation box)) @.scheme ("scheme array read" 0 (:representation box))}))) - (def: .public (write value box) + (def: .public (write! value box) {#.doc (example "Mutates the value in the box.")} (All [a] (-> a (All [!] (-> (Box ! a) (Thread ! Any))))) (function (_ !) @@ -104,10 +104,10 @@ (function (_ !) ((ffa !) !)))) -(def: .public (update f box) +(def: .public (update! f box) {#.doc (example "Update a box's value by applying a function to it.")} (All [a !] (-> (-> a a) (Box ! a) (Thread ! a))) (do ..monad - [old (read box) - _ (write (f old) box)] + [old (read! box) + _ (write! (f old) box)] (in old))) diff --git a/stdlib/source/library/lux/data/binary.lux b/stdlib/source/library/lux/data/binary.lux index b1290557f..cff9714e2 100644 --- a/stdlib/source/library/lux/data/binary.lux +++ b/stdlib/source/library/lux/data/binary.lux @@ -143,7 +143,7 @@ ... Default (|> binary - (array.read index) + (array.read! index) (maybe.else (: (I64 Any) 0)) (:as I64)))]) @@ -358,7 +358,7 @@ ... Default (..copy length offset binary 0 (..empty length))))))) -(def: .public (drop bytes binary) +(def: .public (after bytes binary) {#.doc (example "Yields a binary BLOB with at most the specified number of bytes removed.")} (-> Nat Binary Binary) (case bytes diff --git a/stdlib/source/library/lux/data/collection/array.lux b/stdlib/source/library/lux/data/collection/array.lux index a141fad68..5d306f773 100644 --- a/stdlib/source/library/lux/data/collection/array.lux +++ b/stdlib/source/library/lux/data/collection/array.lux @@ -77,13 +77,13 @@ @.php ("php array length" array) @.scheme ("scheme array length" array)})) - (template: (!read <read> <null?>) - [(let [output (<read> index array)] + (template: (!read! <read!> <null?>) + [(let [output (<read!> index array)] (if (<null?> output) #.None (#.Some output)))]) - (def: .public (read index array) + (def: .public (read! index array) (All [a] (-> Nat (Array a) (Maybe a))) (if (n.< (size array) index) @@ -101,12 +101,12 @@ #.None (#.Some (:expected value)))) - @.js (!read "js array read" "js object undefined?") - @.python (!read "python array read" "python object none?") - @.lua (!read "lua array read" "lua object nil?") - @.ruby (!read "ruby array read" "ruby object nil?") - @.php (!read "php array read" "php object null?") - @.scheme (!read "scheme array read" "scheme object nil?")}) + @.js (!read! "js array read" "js object undefined?") + @.python (!read! "python array read" "python object none?") + @.lua (!read! "lua array read" "lua object nil?") + @.ruby (!read! "ruby array read" "ruby object nil?") + @.php (!read! "php array read" "php object null?") + @.scheme (!read! "scheme array read" "scheme object nil?")}) #.None)) (def: .public (write! index value array) @@ -152,7 +152,7 @@ (def: .public (contains? index array) (All [a] (-> Nat (Array a) Bit)) - (case (..read index array) + (case (..read! index array) (#.Some _) true @@ -163,7 +163,7 @@ {#.doc (.example "Mutate the array by updating the value at the specified index.")} (All [a] (-> Nat (-> a a) (Array a) (Array a))) - (case (read index array) + (case (read! index array) #.None array @@ -176,7 +176,7 @@ (All [a] (-> Nat a (-> a a) (Array a) (Array a))) (write! index - (|> array (read index) (maybe.else default) transform) + (|> array (read! index) (maybe.else default) transform) array)) (def: .public (copy! length src_start src_array dest_start dest_array) @@ -187,7 +187,7 @@ (if (n.= 0 length) dest_array (list\fold (function (_ offset target) - (case (read (n.+ offset src_start) src_array) + (case (read! (n.+ offset src_start) src_array) #.None target @@ -200,7 +200,7 @@ {#.doc "Finds out how many cells in an array are occupied."} (All [a] (-> (Array a) Nat)) (list\fold (function (_ idx count) - (case (read idx array) + (case (read! idx array) #.None count @@ -219,7 +219,7 @@ (All [a] (-> (Predicate a) (Array a) (Array a))) (list\fold (function (_ idx xs') - (case (read idx xs) + (case (read! idx xs) #.None xs' @@ -237,7 +237,7 @@ (let [arr_size (size xs)] (loop [idx 0] (if (n.< arr_size idx) - (case (read idx xs) + (case (read! idx xs) #.None (recur (inc idx)) @@ -254,7 +254,7 @@ (let [arr_size (size xs)] (loop [idx 0] (if (n.< arr_size idx) - (case (read idx xs) + (case (read! idx xs) #.None (recur (inc idx)) @@ -269,7 +269,7 @@ (All [a] (-> (Array a) (Array a))) (let [arr_size (size xs)] (list\fold (function (_ idx ys) - (case (read idx xs) + (case (read! idx xs) #.None ys @@ -300,7 +300,7 @@ _ (recur (dec idx) - (case (read idx array) + (case (read! idx array) (#.Some head) (#.Item head output) @@ -318,7 +318,7 @@ _ (recur (dec idx) - (#.Item (maybe.else default (read idx array)) + (#.Item (maybe.else default (read! idx array)) output))))) (implementation: .public (equivalence (^open ",\.")) @@ -330,7 +330,7 @@ (and (n.= sxy sxs) (list\fold (function (_ idx prev) (and prev - (case [(read idx xs) (read idx ys)] + (case [(read! idx xs) (read! idx ys)] [#.None #.None] true @@ -362,7 +362,7 @@ (if (n.= 0 arr_size) (empty arr_size) (list\fold (function (_ idx mb) - (case (read idx ma) + (case (read! idx ma) #.None mb @@ -380,7 +380,7 @@ (loop [so_far init idx 0] (if (n.< arr_size idx) - (case (read idx xs) + (case (read! idx xs) #.None (recur so_far (inc idx)) @@ -396,7 +396,7 @@ (let [size (..size array)] (loop [idx 0] (if (n.< size idx) - (case (..read idx array) + (case (..read! idx array) (#.Some value) (<op> (predicate value) (recur (inc idx))) diff --git a/stdlib/source/library/lux/data/collection/bits.lux b/stdlib/source/library/lux/data/collection/bits.lux index ef10e0f6d..e5e85e361 100644 --- a/stdlib/source/library/lux/data/collection/bits.lux +++ b/stdlib/source/library/lux/data/collection/bits.lux @@ -52,14 +52,14 @@ (-> Nat Bits Bit) (let [[chunk_index bit_index] (n./% chunk_size index)] (.and (n.< (array.size bits) chunk_index) - (|> (array.read chunk_index bits) + (|> (array.read! chunk_index bits) (maybe.else empty_chunk) (i64.one? bit_index))))) (def: (chunk idx bits) (-> Nat Bits Chunk) (if (n.< (array.size bits) idx) - (|> bits (array.read idx) (maybe.else empty_chunk)) + (|> bits (array.read! idx) (maybe.else empty_chunk)) empty_chunk)) (template [<name> <op>] diff --git a/stdlib/source/library/lux/data/collection/dictionary.lux b/stdlib/source/library/lux/data/collection/dictionary.lux index 642b19b57..fb7aaaa83 100644 --- a/stdlib/source/library/lux/data/collection/dictionary.lux +++ b/stdlib/source/library/lux/data/collection/dictionary.lux @@ -130,7 +130,7 @@ ... Expands a copy of the array, to have 1 extra slot, which is used ... for storing the value. -(def: (insert! idx value old_array) +(def: (array\has idx value old_array) (All [a] (-> Index a (Array a) (Array a))) (let [old_size (array.size old_array)] (|> (array.empty (inc old_size)) @@ -139,17 +139,17 @@ (array.copy! (n.- idx old_size) idx old_array (inc idx))))) ... Creates a copy of an array with an index set to a particular value. -(def: (revised! idx value array) +(def: (array\revised idx value array) (All [a] (-> Index a (Array a) (Array a))) (|> array array.clone (array.write! idx value))) ... Creates a clone of the array, with an empty position at index. -(def: (vacant! idx array) +(def: (array\lacks' idx array) (All [a] (-> Index (Array a) (Array a))) (|> array array.clone (array.delete! idx))) ... Shrinks a copy of the array by removing the space at index. -(def: (lacks! idx array) +(def: (array\lacks idx array) (All [a] (-> Index (Array a) (Array a))) (let [new_size (dec (array.size array))] (|> (array.empty new_size) @@ -236,7 +236,7 @@ (All [k v] (-> Index (Hierarchy k v) [Bit_Map (Base k v)])) (product.right (list\fold (function (_ idx [insertion_idx node]) (let [[bitmap base] node] - (case (array.read idx h_array) + (case (array.read! idx h_array) #.None [insertion_idx node] (#.Some sub_node) (if (n.= except_idx idx) [insertion_idx node] @@ -254,7 +254,7 @@ (List Index) (list.indices hierarchy_nodes_size)) -(def: (promotion has' key_hash level bitmap base) +(def: (promotion node\has key_hash level bitmap base) (All [k v] (-> (-> Level Hash_Code k v (Hash k) (Node k v) (Node k v)) (Hash k) Level @@ -264,13 +264,13 @@ (if (with_bit_position? (to_bit_position hierarchy_idx) bitmap) [(inc base_idx) - (case (array.read base_idx base) + (case (array.read! base_idx base) (#.Some (#.Left sub_node)) (array.write! hierarchy_idx sub_node h_array) (#.Some (#.Right [key' val'])) (array.write! hierarchy_idx - (has' (level_up level) (\ key_hash hash key') key' val' key_hash empty_node) + (node\has (level_up level) (\ key_hash hash key') key' val' key_hash empty_node) h_array) #.None @@ -292,22 +292,22 @@ _ #0))) -(def: (has' level hash key val key_hash node) +(def: (node\has level hash key val key_hash node) (All [k v] (-> Level Hash_Code k v (Hash k) (Node k v) (Node k v))) (case node ... For #Hierarchy nodes, check whether one can add the element to ... a sub-node. If impossible, introduce a new singleton sub-node. (#Hierarchy _size hierarchy) (let [idx (level_index level hash) - [_size' sub_node] (case (array.read idx hierarchy) + [_size' sub_node] (case (array.read! idx hierarchy) (#.Some sub_node) [_size sub_node] _ [(inc _size) empty_node])] (#Hierarchy _size' - (revised! idx (has' (level_up level) hash key val key_hash sub_node) - hierarchy))) + (array\revised idx (node\has (level_up level) hash key val key_hash sub_node) + hierarchy))) ... For #Base nodes, check if the corresponding Bit_Position has ... already been used. @@ -316,38 +316,38 @@ (if (with_bit_position? bit bitmap) ... If so... (let [idx (base_index bit bitmap)] - (case (array.read idx base) + (case (array.read! idx base) ... If it's being used by a node, add the KV to it. (#.Some (#.Left sub_node)) - (let [sub_node' (has' (level_up level) hash key val key_hash sub_node)] - (#Base bitmap (revised! idx (#.Left sub_node') base))) + (let [sub_node' (node\has (level_up level) hash key val key_hash sub_node)] + (#Base bitmap (array\revised idx (#.Left sub_node') base))) ... Otherwise, if it's being used by a KV, compare the keys. (#.Some (#.Right key' val')) (if (\ key_hash = key key') ... If the same key is found, replace the value. - (#Base bitmap (revised! idx (#.Right key val) base)) + (#Base bitmap (array\revised idx (#.Right key val) base)) ... Otherwise, compare the hashes of the keys. - (#Base bitmap (revised! idx - (#.Left (let [hash' (\ key_hash hash key')] - (if (n.= hash hash') - ... If the hashes are - ... the same, a new - ... #Collisions node - ... is added. - (#Collisions hash (|> (array.empty 2) - (array.write! 0 [key' val']) - (array.write! 1 [key val]))) - ... Otherwise, one can - ... just keep using - ... #Base nodes, so - ... add both KV-pairs - ... to the empty one. - (let [next_level (level_up level)] - (|> empty_node - (has' next_level hash' key' val' key_hash) - (has' next_level hash key val key_hash)))))) - base))) + (#Base bitmap (array\revised idx + (#.Left (let [hash' (\ key_hash hash key')] + (if (n.= hash hash') + ... If the hashes are + ... the same, a new + ... #Collisions node + ... is added. + (#Collisions hash (|> (array.empty 2) + (array.write! 0 [key' val']) + (array.write! 1 [key val]))) + ... Otherwise, one can + ... just keep using + ... #Base nodes, so + ... add both KV-pairs + ... to the empty one. + (let [next_level (level_up level)] + (|> empty_node + (node\has next_level hash' key' val' key_hash) + (node\has next_level hash key val key_hash)))))) + base))) #.None (undefined))) @@ -359,13 +359,13 @@ ... KV-pair as a singleton node to it. (#Hierarchy (inc base_count) (|> base - (promotion has' key_hash level bitmap) + (promotion node\has key_hash level bitmap) (array.write! (level_index level hash) - (has' (level_up level) hash key val key_hash empty_node)))) + (node\has (level_up level) hash key val key_hash empty_node)))) ... Otherwise, just resize the #Base node to accommodate the ... new KV-pair. (#Base (with_bit_position bit bitmap) - (insert! (base_index bit bitmap) (#.Right [key val]) base)))))) + (array\has (base_index bit bitmap) (#.Right [key val]) base)))))) ... For #Collisions nodes, compare the hashes. (#Collisions _hash _colls) @@ -376,17 +376,17 @@ ... If the key was already present in the collisions-list, its ... value gets updated. (#.Some coll_idx) - (#Collisions _hash (revised! coll_idx [key val] _colls)) + (#Collisions _hash (array\revised coll_idx [key val] _colls)) ... Otherwise, the KV-pair is added to the collisions-list. #.None - (#Collisions _hash (insert! (array.size _colls) [key val] _colls))) + (#Collisions _hash (array\has (array.size _colls) [key val] _colls))) ... If the hashes are not equal, create a new #Base node that ... contains the old #Collisions node, plus the new KV-pair. (|> (#Base (level_bit_position level _hash) (|> (array.empty 1) (array.write! 0 (#.Left node)))) - (has' level hash key val key_hash))) + (node\has level hash key val key_hash))) )) (def: (lacks' level hash key key_hash node) @@ -396,7 +396,7 @@ ... the Hash-Code. (#Hierarchy h_size h_array) (let [idx (level_index level hash)] - (case (array.read idx h_array) + (case (array.read! idx h_array) ... If not, there's nothing to remove. #.None node @@ -415,17 +415,17 @@ ... If so, perform it. (#Base (demotion idx [h_size h_array])) ... Otherwise, just clear the space. - (#Hierarchy (dec h_size) (vacant! idx h_array))) + (#Hierarchy (dec h_size) (array\lacks' idx h_array))) ... But if the sub_removal yielded a non_empty node, then ... just update the hiearchy branch. - (#Hierarchy h_size (revised! idx sub_node' h_array))))))) + (#Hierarchy h_size (array\revised idx sub_node' h_array))))))) ... For #Base nodes, check whether the Bit_Position is set. (#Base bitmap base) (let [bit (level_bit_position level hash)] (if (with_bit_position? bit bitmap) (let [idx (base_index bit bitmap)] - (case (array.read idx base) + (case (array.read! idx base) ... If set, check if it's a sub_node, and remove the KV ... from it. (#.Some (#.Left sub_node)) @@ -443,11 +443,11 @@ ... But if not, then just unset the position and ... remove the node. (#Base (without_bit_position bit bitmap) - (lacks! idx base))) + (array\lacks idx base))) ... But, if it did not come out empty, then the ... position is kept, and the node gets updated. (#Base bitmap - (revised! idx (#.Left sub_node') base))))) + (array\revised idx (#.Left sub_node') base))))) ... If, however, there was a KV-pair instead of a sub-node. (#.Some (#.Right [key' val'])) @@ -455,7 +455,7 @@ (if (\ key_hash = key key') ... If so, remove the KV-pair and unset the Bit_Position. (#Base (without_bit_position bit bitmap) - (lacks! idx base)) + (array\lacks idx base)) ... Otherwise, there's nothing to remove. node) @@ -478,7 +478,7 @@ ... an empty node. empty_node ... Otherwise, just shrink the array by removing the KV-pair. - (#Collisions _hash (lacks! idx _colls)))) + (#Collisions _hash (array\lacks idx _colls)))) )) (def: (value' level hash key key_hash node) @@ -486,7 +486,7 @@ (case node ... For #Hierarchy nodes, just look-up the key on its children. (#Hierarchy _size hierarchy) - (case (array.read (level_index level hash) hierarchy) + (case (array.read! (level_index level hash) hierarchy) #.None #.None (#.Some sub_node) (value' (level_up level) hash key key_hash sub_node)) @@ -494,7 +494,7 @@ (#Base bitmap base) (let [bit (level_bit_position level hash)] (if (with_bit_position? bit bitmap) - (case (array.read (base_index bit bitmap) base) + (case (array.read! (base_index bit bitmap) base) (#.Some (#.Left sub_node)) (value' (level_up level) hash key key_hash sub_node) @@ -573,7 +573,7 @@ (def: .public (has key val dict) (All [k v] (-> k v (Dictionary k v) (Dictionary k v))) (let [[key_hash node] dict] - [key_hash (has' root_level (\ key_hash hash key) key val key_hash node)])) + [key_hash (node\has root_level (\ key_hash hash key) key val key_hash node)])) (def: .public (lacks key dict) (All [k v] (-> k (Dictionary k v) (Dictionary k v))) @@ -593,7 +593,7 @@ (exception: .public key_already_exists) -(def: .public (try_put key val dict) +(def: .public (has' key val dict) {#.doc "Only puts the KV-pair if the key is not already present."} (All [k v] (-> k v (Dictionary k v) (Try (Dictionary k v)))) (case (value key dict) @@ -610,7 +610,7 @@ (#.Some val) (has key (f val) dict))) -(def: .public (upsert key default f dict) +(def: .public (revised' key default f dict) {#.doc (example "Updates the value at the key; if it exists." "Otherwise, puts a value by applying the function to a default.")} (All [k v] (-> k v (-> v v) (Dictionary k v) (Dictionary k v))) @@ -672,7 +672,7 @@ dict1 (entries dict2))) -(def: .public (re_bind from_key to_key dict) +(def: .public (re_bound from_key to_key dict) {#.doc (example "If there is a value under 'from_key', remove 'from_key' and store the value under 'to_key'.")} (All [k v] (-> k k (Dictionary k v) (Dictionary k v))) (case (value from_key dict) diff --git a/stdlib/source/library/lux/data/collection/list.lux b/stdlib/source/library/lux/data/collection/list.lux index ff5a1fe12..7298a5039 100644 --- a/stdlib/source/library/lux/data/collection/list.lux +++ b/stdlib/source/library/lux/data/collection/list.lux @@ -100,8 +100,8 @@ <then>) <else>))] - [take (#.Item x (take (dec n) xs')) #.End] - [drop (drop (dec n) xs') xs] + [first (#.Item x (first (dec n) xs')) #.End] + [after (after (dec n) xs') xs] ) (template [<name> <then> <else>] @@ -121,7 +121,7 @@ [until (until predicate xs') xs] ) -(def: .public (split n xs) +(def: .public (split_at n xs) (All [a] (-> Nat (List a) [(List a) (List a)])) (if (n.> 0 n) @@ -130,7 +130,7 @@ [#.End #.End] (#.Item x xs') - (let [[tail rest] (split (dec n) xs')] + (let [[tail rest] (split_at (dec n) xs')] [(#.Item x tail) rest])) [#.End xs])) @@ -161,7 +161,7 @@ #.End _ - (let [[pre post] (split size list)] + (let [[pre post] (split_at size list)] (#.Item pre (sub size post))))) (def: .public (repeated n x) diff --git a/stdlib/source/library/lux/data/collection/queue.lux b/stdlib/source/library/lux/data/collection/queue.lux index 04fd1c6b5..3e017d382 100644 --- a/stdlib/source/library/lux/data/collection/queue.lux +++ b/stdlib/source/library/lux/data/collection/queue.lux @@ -31,7 +31,7 @@ (let [(^slots [#front #rear]) queue] (list\compose front (list.reversed rear)))) -(def: .public peek +(def: .public front {#.doc (example "Yields the first value in the queue, if any.")} (All [a] (-> (Queue a) (Maybe a))) (|>> (get@ #front) list.head)) @@ -52,7 +52,7 @@ (or (list.member? equivalence front member) (list.member? equivalence rear member)))) -(def: .public (pop queue) +(def: .public (next queue) (All [a] (-> (Queue a) (Queue a))) (case (get@ #front queue) ... Empty... @@ -70,7 +70,7 @@ (|> queue (set@ #front front')))) -(def: .public (push val queue) +(def: .public (end val queue) (All [a] (-> a (Queue a) (Queue a))) (case (get@ #front queue) #.End diff --git a/stdlib/source/library/lux/data/collection/queue/priority.lux b/stdlib/source/library/lux/data/collection/queue/priority.lux index 138b86876..88da217c3 100644 --- a/stdlib/source/library/lux/data/collection/queue/priority.lux +++ b/stdlib/source/library/lux/data/collection/queue/priority.lux @@ -46,7 +46,7 @@ Queue (:abstraction #.None)) - (def: .public (peek queue) + (def: .public (front queue) (All [a] (-> (Queue a) (Maybe a))) (do maybe.monad [tree (:representation queue)] @@ -84,7 +84,7 @@ (or (recur left) (recur right)))))) - (def: .public (pop queue) + (def: .public (next queue) (All [a] (-> (Queue a) (Queue a))) (:abstraction (do maybe.monad @@ -112,7 +112,7 @@ (#.Some =right) (#.Some (\ ..builder branch left =right))))))))) - (def: .public (push priority value queue) + (def: .public (end priority value queue) (All [a] (-> Priority a (Queue a) (Queue a))) (let [addition (\ ..builder leaf priority value)] (:abstraction diff --git a/stdlib/source/library/lux/data/collection/row.lux b/stdlib/source/library/lux/data/collection/row.lux index c36a5377e..230de34a1 100644 --- a/stdlib/source/library/lux/data/collection/row.lux +++ b/stdlib/source/library/lux/data/collection/row.lux @@ -105,7 +105,7 @@ ... Just add the tail to it (#Base tail) ... Otherwise, check whether there's a vacant spot - (case (array.read sub_idx parent) + (case (array.read! sub_idx parent) ... If so, set the path to the tail #.None (..path (level_down level) tail) @@ -129,7 +129,7 @@ (def: (put' level idx val hierarchy) (All [a] (-> Level Index a (Hierarchy a) (Hierarchy a))) (let [sub_idx (branch_idx (i64.right_shifted level idx))] - (case (array.read sub_idx hierarchy) + (case (array.read! sub_idx hierarchy) (#.Some (#Hierarchy sub_node)) (|> (array.clone hierarchy) (array.write! sub_idx (#Hierarchy (put' (level_down level) idx val sub_node)))) @@ -152,7 +152,7 @@ (n.> branching_exponent level) (do maybe.monad - [base|hierarchy (array.read sub_idx hierarchy) + [base|hierarchy (array.read! sub_idx hierarchy) sub (case base|hierarchy (#Hierarchy sub) (without_tail size (level_down level) sub) @@ -254,7 +254,7 @@ (loop [level (get@ #level row) hierarchy (get@ #root row)] (case [(n.> branching_exponent level) - (array.read (branch_idx (i64.right_shifted level idx)) hierarchy)] + (array.read! (branch_idx (i64.right_shifted level idx)) hierarchy)] [#1 (#.Some (#Hierarchy sub))] (recur (level_down level) sub) @@ -272,7 +272,7 @@ (All [a] (-> Nat (Row a) (Try a))) (do try.monad [base (base_for idx row)] - (case (array.read (branch_idx idx) base) + (case (array.read! (branch_idx idx) base) (#.Some value) (#try.Success value) @@ -324,7 +324,7 @@ root (maybe.else (empty_hierarchy []) (without_tail row_size init_level (get@ #root row)))] (if (n.> branching_exponent level) - (case [(array.read 1 root) (array.read 0 root)] + (case [(array.read! 1 root) (array.read! 0 root)] [#.None (#.Some (#Hierarchy sub_node))] (recur (level_down level) sub_node) diff --git a/stdlib/source/library/lux/data/collection/sequence.lux b/stdlib/source/library/lux/data/collection/sequence.lux index 6264d6083..d60fd99d4 100644 --- a/stdlib/source/library/lux/data/collection/sequence.lux +++ b/stdlib/source/library/lux/data/collection/sequence.lux @@ -84,7 +84,7 @@ xs)))] [while until (-> a Bit) (pred x) pred |>] - [take drop Nat (n.= 0 pred) (dec pred) not] + [first after Nat (n.= 0 pred) (dec pred) not] ) (template [<splitter> <pred_type> <pred_test> <pred_step>] @@ -98,7 +98,7 @@ [(#.Item [x tail]) next]))))] [split_when (-> a Bit) (pred x) pred] - [split Nat (n.= 0 pred) (dec pred)] + [split_at Nat (n.= 0 pred) (dec pred)] ) (def: .public (unfold step init) diff --git a/stdlib/source/library/lux/data/collection/set/multi.lux b/stdlib/source/library/lux/data/collection/set/multi.lux index 46f395b21..b4786c825 100644 --- a/stdlib/source/library/lux/data/collection/set/multi.lux +++ b/stdlib/source/library/lux/data/collection/set/multi.lux @@ -37,7 +37,7 @@ 0 set _ (|> set :representation - (dictionary.upsert elem 0 (n.+ multiplicity)) + (dictionary.revised' elem 0 (n.+ multiplicity)) :abstraction))) (def: .public (lacks multiplicity elem set) diff --git a/stdlib/source/library/lux/data/collection/stack.lux b/stdlib/source/library/lux/data/collection/stack.lux index af2b3c3ea..2b9cbc2e4 100644 --- a/stdlib/source/library/lux/data/collection/stack.lux +++ b/stdlib/source/library/lux/data/collection/stack.lux @@ -27,7 +27,7 @@ (All [a] (-> (Stack a) Bit)) (|>> :representation //.empty?)) - (def: .public (peek stack) + (def: .public (value stack) {#.doc (example "Yields the top value in the stack, if any.")} (All [a] (-> (Stack a) (Maybe a))) (case (:representation stack) @@ -37,7 +37,7 @@ (#.Item value _) (#.Some value))) - (def: .public (pop stack) + (def: .public (next stack) (All [a] (-> (Stack a) (Maybe [a (Stack a)]))) (case (:representation stack) #.End @@ -46,7 +46,7 @@ (#.Item top stack') (#.Some [top (:abstraction stack')]))) - (def: .public (push value stack) + (def: .public (top value stack) (All [a] (-> a (Stack a) (Stack a))) (:abstraction (#.Item value (:representation stack)))) diff --git a/stdlib/source/library/lux/data/format/binary.lux b/stdlib/source/library/lux/data/format/binary.lux index f3ce9f830..e16c2cebd 100644 --- a/stdlib/source/library/lux/data/format/binary.lux +++ b/stdlib/source/library/lux/data/format/binary.lux @@ -192,7 +192,7 @@ original_count) value (if (n.= original_count capped_count) value - (|> value row.list (list.take capped_count) row.of_list)) + (|> value row.list (list.first capped_count) row.of_list)) (^open "specification\.") ..monoid [size mutation] (|> value (row\map valueW) diff --git a/stdlib/source/library/lux/data/format/css/value.lux b/stdlib/source/library/lux/data/format/css/value.lux index a39469994..c2fb914c2 100644 --- a/stdlib/source/library/lux/data/format/css/value.lux +++ b/stdlib/source/library/lux/data/format/css/value.lux @@ -61,7 +61,7 @@ (let [raw (%.frac value)] (if (f.< +0.0 value) raw - (|> raw (text.split 1) maybe.assume product.right)))) + (|> raw (text.split_at 1) maybe.assume product.right)))) (abstract: .public (Value brand) {} diff --git a/stdlib/source/library/lux/data/format/json.lux b/stdlib/source/library/lux/data/format/json.lux index 45ac870c0..7f6ca24a8 100644 --- a/stdlib/source/library/lux/data/format/json.lux +++ b/stdlib/source/library/lux/data/format/json.lux @@ -227,7 +227,7 @@ value (let [raw (\ f.decimal encode value)] (if (f.< +0.0 value) raw - (|> raw (text.split 1) maybe.assume product.right)))))) + (|> raw (text.split_at 1) maybe.assume product.right)))))) (def: escape "\") (def: escaped_dq (text\compose ..escape text.double_quote)) @@ -372,7 +372,7 @@ (loop [_ []]) (do {! <>.monad} [chars (<text>.some (<text>.none_of (text\compose "\" text.double_quote))) - stop <text>.peek]) + stop <text>.next]) (if (text\= "\" stop) (do ! [escaped escaped_parser diff --git a/stdlib/source/library/lux/data/format/markdown.lux b/stdlib/source/library/lux/data/format/markdown.lux index 08b26a686..281425105 100644 --- a/stdlib/source/library/lux/data/format/markdown.lux +++ b/stdlib/source/library/lux/data/format/markdown.lux @@ -52,7 +52,7 @@ (template [<name> <prefix>] [(def: .public (<name> content) - (-> Text Markdown) + (-> Text (Markdown Block)) (:abstraction (format <prefix> " " (..safe content) ..blank_line)))] [heading/1 "#"] @@ -110,10 +110,14 @@ (Markdown Block)) (|>> list.enumeration (list\map (function (_ [idx [summary detail]]) - (format (%.nat (inc idx)) ". " (:representation summary) text.new_line + (format "1. " (:representation summary) (case detail (#.Some detail) - (|> detail :representation ..indent (text.enclosed [text.new_line text.new_line])) + (|> detail + :representation + ..indent + (text.enclosed [text.new_line text.new_line]) + (format text.new_line)) #.None "")))) @@ -124,10 +128,14 @@ (-> (List [(Markdown Span) (Maybe (Markdown Block))]) (Markdown Block)) (|>> (list\map (function (_ [summary detail]) - (format "*. " (:representation summary) text.new_line + (format "* " (:representation summary) (case detail (#.Some detail) - (|> detail :representation ..indent (text.enclosed [text.new_line text.new_line])) + (|> detail + :representation + ..indent + (text.enclosed [text.new_line text.new_line]) + (format text.new_line)) #.None "")))) @@ -137,7 +145,7 @@ (def: .public snippet {#.doc "A snippet of code."} (-> Text (Markdown Span)) - (|>> ..safe (text.enclosed ["`" "`"]) :abstraction)) + (|>> (text.enclosed ["`` " " ``"]) :abstraction)) (def: .public code {#.doc "A block of code."} @@ -180,6 +188,6 @@ ) (def: .public markdown - (-> (Markdown Any) Text) + (All [a] (-> (Markdown a) Text)) (|>> :representation)) ) diff --git a/stdlib/source/library/lux/data/text.lux b/stdlib/source/library/lux/data/text.lux index 096a968ee..e2f781d64 100644 --- a/stdlib/source/library/lux/data/text.lux +++ b/stdlib/source/library/lux/data/text.lux @@ -154,7 +154,7 @@ (#.Some ("lux text clip" offset (n.- offset size) input)) #.None))) -(def: .public (split at x) +(def: .public (split_at at x) (-> Nat Text (Maybe [Text Text])) (case [(..clip 0 at x) (..clip' at x)] [(#.Some pre) (#.Some post)] @@ -167,8 +167,8 @@ (-> Text Text (Maybe [Text Text])) (do maybe.monad [index (index_of token sample) - [pre post'] (split index sample) - [_ post] (split (size token) post')] + [pre post'] (split_at index sample) + [_ post] (split_at (size token) post')] (in [pre post]))) (def: .public (all_split_by token sample) diff --git a/stdlib/source/library/lux/debug.lux b/stdlib/source/library/lux/debug.lux index 234333bd8..488933f58 100644 --- a/stdlib/source/library/lux/debug.lux +++ b/stdlib/source/library/lux/debug.lux @@ -158,12 +158,12 @@ (case (ffi.check [java/lang/Object] object) (#.Some value) (let [value (:as (array.Array java/lang/Object) value)] - (case (array.read 0 value) + (case (array.read! 0 value) (^multi (#.Some tag) {(ffi.check java/lang/Integer tag) (#.Some tag)} - {[(array.read 1 value) - (array.read 2 value)] + {[(array.read! 1 value) + (array.read! 2 value)] [last? (#.Some choice)]}) (let [last? (case last? diff --git a/stdlib/source/library/lux/documentation.lux b/stdlib/source/library/lux/documentation.lux new file mode 100644 index 000000000..798bf3056 --- /dev/null +++ b/stdlib/source/library/lux/documentation.lux @@ -0,0 +1,366 @@ +(.module: + [library + [lux (#- Definition Module example type) + ["." meta] + [abstract + [monad (#+ do)]] + [control + ["." maybe ("#\." functor)] + ["." exception (#+ exception:)] + ["<>" parser + ["<.>" code (#+ Parser)]]] + [data + ["." product] + ["." text (#+ \n) ("#\." order) + ["%" format (#+ format)]] + [collection + ["." list ("#\." monad fold monoid)] + ["." set (#+ Set)]] + [format + ["md" markdown (#+ Markdown Block)]]] + [macro + [syntax (#+ syntax:)] + ["." code] + ["." template]] + [math + [number + ["n" nat]]] + [tool + [compiler + [language + [lux + ["." syntax]]]]]]]) + +(type: Fragment + (#Comment Text) + (#Code Code)) + +(def: fragment + (Parser Fragment) + (<>.or <code>.text + <code>.any)) + +(def: (reference_column code) + (-> Code Nat) + (case code + (^template [<tag>] + [[[_ _ column] (<tag> _)] + column]) + ([#.Bit] + [#.Nat] + [#.Int] + [#.Rev] + [#.Frac] + [#.Text] + [#.Identifier] + [#.Tag]) + + (^template [<tag>] + [[[_ _ column] (<tag> members)] + (|> members + (list\map reference_column) + (list\fold n.min column))]) + ([#.Form] + [#.Tuple]) + + [[_ _ column] (#.Record pairs)] + (|> (list\compose (list\map (|>> product.left reference_column) pairs) + (list\map (|>> product.right reference_column) pairs)) + (list\fold n.min column)) + )) + +(def: (padding reference_column [_ old_line old_column] [_ new_line new_column]) + (-> Nat Location Location Text) + (if (n.= old_line new_line) + (text.joined (list.repeated (n.- old_column new_column) " ")) + (format (if (n.< new_line old_line) + (text.joined (list.repeated (n.- old_line new_line) \n)) + "") + (if (n.< new_column reference_column) + (text.joined (list.repeated (n.- reference_column new_column) " ")) + "")))) + +(def: un_paired + (All [a] (-> (List [a a]) (List a))) + (let [melded (: (All [a] (-> [a a] (List a) (List a))) + (function (_ [left right] tail) + (list& left right tail)))] + (|>> list.reversed + (list\fold melded #.End)))) + +(def: (code_documentation old_location reference_column example) + (-> Location Nat Code [Location Text]) + (case example + (^template [<tag> <format>] + [[new_location (<tag> value)] + (let [documentation (`` (|> value (~~ (template.spliced <format>))))] + [(update@ #.column (n.+ (text.size documentation)) new_location) + (format (padding reference_column old_location new_location) + documentation)])]) + ([#.Bit [%.bit]] + [#.Nat [%.nat]] + [#.Int [%.int]] + [#.Rev [%.rev]] + [#.Frac [%.frac]] + [#.Text [%.text]] + [#.Identifier [%.name]] + [#.Tag [%.name (text.prefix syntax.sigil)]]) + + (^template [|<| |>| <tag> <prep>] + [[group_location (<tag> members)] + (let [[group_location' members_documentation] (list\fold (function (_ part [last_location text_accum]) + (let [[member_location member_documentation] (code_documentation last_location reference_column part)] + [member_location (format text_accum member_documentation)])) + [(update@ #.column inc group_location) ""] + (<prep> members))] + [(update@ #.column inc group_location') + (format (padding reference_column old_location group_location) + |<| members_documentation |>|)])]) + ([syntax.open_form syntax.close_form #.Form |>] + [syntax.open_tuple syntax.close_tuple #.Tuple |>] + [syntax.open_record syntax.close_record #.Record ..un_paired]) + )) + +(def: blank_line + Text + (format \n \n)) + +(def: single_line_comment + (-> Text Text) + (text.prefix "... ")) + +(def: (fragment_documentation fragment) + (-> Fragment Text) + (case fragment + (#Comment comment) + (..single_line_comment comment) + + (#Code example) + (let [reference_column (..reference_column example) + [location _] example] + (|> example + (..code_documentation (set@ #.column reference_column location) reference_column) + product.right)))) + +(def: type + (-> Type Text) + %.type) + +(def: description + (Parser (Maybe Code)) + (<>.or (<code>.text! "") + <code>.any)) + +(exception: .public (unqualified_identifier {name Name}) + (exception.report + ["Name" (%.name name)])) + +(def: qualified_identifier + (Parser Name) + (do <>.monad + [name <code>.identifier] + (case name + ["" _] + (<>.failure (exception.error ..unqualified_identifier [name])) + + _ + (in name)))) + +(def: example_separator + Code + (let [c/01 "...." + c/04 (format c/01 c/01 c/01 c/01) + c/16 (format c/04 c/04 c/04 c/04)] + (code.text (format blank_line + c/16 \n c/16 + blank_line)))) + +(type: Example + (List Fragment)) + +(def: example + (Parser Example) + (<code>.tuple (<>.many ..fragment))) + +(def: example_documentation + (-> Example Code) + (|>> (list\map ..fragment_documentation) + (list.interposed ..blank_line) + (text.join_with "") + code.text)) + +(syntax: (minimal_definition_documentation + [name ..qualified_identifier]) + (with_expansions [<\n> (~! text.\n)] + (in (list (` ($_ ((~! md.then)) + ... Name + (<| ((~! md.heading/3)) + (~ (code.text (|> name product.right [""] %.name)))) + ... Type + (<| ((~! md.code)) + ((~! ..type) ("lux in-module" + (~ (code.text (product.left name))) + (.:of (~ (code.identifier name))))))) + ))))) + +(syntax: (definition_documentation + [name ..qualified_identifier + description ..description + examples (<>.some ..example)]) + (with_expansions [<\n> (~! text.\n)] + (in (list (` ($_ ((~! md.then)) + ((~! ..minimal_definition_documentation) + (~ (code.identifier name))) + ... Description + (~+ (case description + (#.Some description) + (list (` (<| ((~! md.paragraph)) + ((~! md.text)) + (~ description)))) + + #.None + (list))) + ... Examples + (~+ (case examples + #.End + (list) + + _ + (list (` (<| ((~! md.code)) + ((~! %.format) + (~+ (|> examples + (list\map ..example_documentation) + (list.interposed ..example_separator)))))))))) + ))))) + +(type: .public Definition + {#definition Text + #documentation (Markdown Block)}) + +(type: .public #rec Module + {#module Text + #expected (Set Text) + #definitions (List Definition)}) + +(syntax: .public (default [name ..qualified_identifier]) + (let [[_ short] name] + (in (list (` (: ..Definition + {#..definition (~ (code.text short)) + #..documentation ((~! ..minimal_definition_documentation) + (~ (code.identifier name)))})))))) + +(syntax: .public (documentation: [name ..qualified_identifier + extra (<>.some <code>.any)]) + (let [[_ short] name] + (in (list (` (.def: .public (~ (code.local_identifier short)) + ..Definition + {#..definition (~ (code.text short)) + #..documentation ((~! ..definition_documentation) + (~ (code.identifier name)) + (~+ extra))})))))) + +(def: definitions_documentation + (-> (List Definition) (Markdown Block)) + (|>> (list.sorted (function (_ left right) + (text\< (get@ #definition right) + (get@ #definition left)))) + (list\map (get@ #documentation)) + (list\fold md.then md.empty))) + +(def: expected_separator + Text + (text.of_char 31)) + +(def: expected_format + (-> (List Text) Text) + (list\fold (function (_ short aggregate) + (case aggregate + "" short + _ (format aggregate ..expected_separator short))) + "")) + +(def: expected + (-> Text (Set Text)) + (|>> (text.all_split_by ..expected_separator) + (set.of_list text.hash))) + +(def: (module' name expected definitions) + (-> Text Text (List Definition) Module) + {#module name + #expected (..expected expected) + #definitions definitions}) + +(syntax: .public (module [[name _] ..qualified_identifier + definitions (<code>.tuple (<>.some <code>.any)) + subs (<code>.tuple (<>.some <code>.any))]) + (do meta.monad + [expected (meta.exports name)] + (in (list (` (: (List Module) + (list& ((~! module') + (~ (code.text name)) + (~ (code.text (|> expected + (list\map product.left) + ..expected_format))) + (list (~+ definitions))) + ($_ (\ (~! list.monoid) (~' compose)) + (: (List Module) + (\ (~! list.monoid) (~' identity))) + (~+ subs))))))))) + +(def: listing + (-> (List Text) (Markdown Block)) + (|>> (list.sorted text\<) + (list\map (function (_ definition) + [(md.snippet definition) + #.None])) + md.numbered_list)) + +(def: (module_documentation module) + (-> Module (Markdown Block)) + (let [(^slots [#expected]) module] + ($_ md.then + ... Name + (md.heading/1 (get@ #module module)) + ... Definitions + (md.heading/2 "Definitions") + (|> module + (get@ #definitions) + (list.only (|>> (get@ #definition) + (set.member? expected))) + ..definitions_documentation) + ... Missing documentation + (case (|> module + (get@ #definitions) + (list\fold (function (_ definition missing) + (set.lacks (get@ #definition definition) missing)) + expected) + set.list) + #.End + md.empty + + missing + ($_ md.then + (md.heading/2 "Missing documentation") + (..listing missing))) + ... Un-expected documentation + (case (|> module + (get@ #definitions) + (list.only (|>> (get@ #definition) (set.member? expected) not)) + (list\map (get@ #definition))) + #.End + md.empty + + un_expected + ($_ md.then + (md.heading/2 "Un-expected documentation") + (..listing un_expected))) + ))) + +(def: .public documentation + (-> (List Module) Text) + (|>> (list.sorted (function (_ left right) + (text\< (get@ #module right) (get@ #module left)))) + (list\map ..module_documentation) + (list.interposed md.horizontal_rule) + (list\fold md.then (: (Markdown Block) md.empty)) + md.markdown)) diff --git a/stdlib/source/library/lux/math/number/rev.lux b/stdlib/source/library/lux/math/number/rev.lux index 5c0ce4d8e..4eea3ecf7 100644 --- a/stdlib/source/library/lux/math/number/rev.lux +++ b/stdlib/source/library/lux/math/number/rev.lux @@ -295,7 +295,7 @@ (def: (digit idx digits) (-> Nat Digits Nat) (|> digits - (array.read idx) + (array.read! idx) (maybe.else 0))) (def: digits\put! diff --git a/stdlib/source/library/lux/math/random.lux b/stdlib/source/library/lux/math/random.lux index 2ba47c5cd..bb66000be 100644 --- a/stdlib/source/library/lux/math/random.lux +++ b/stdlib/source/library/lux/math/random.lux @@ -268,7 +268,7 @@ [array Array array.of_list] [queue Queue queue.of_list] - [stack Stack (list\fold stack.push stack.empty)] + [stack Stack (list\fold stack.top stack.empty)] ) (def: .public (set hash size value_gen) diff --git a/stdlib/source/library/lux/meta.lux b/stdlib/source/library/lux/meta.lux index 8ed6e30f5..72f0b2b51 100644 --- a/stdlib/source/library/lux/meta.lux +++ b/stdlib/source/library/lux/meta.lux @@ -284,6 +284,22 @@ #.None (#try.Failure ($_ text\compose "Unknown variable: " name)))))) +(def: without_lux_runtime + (-> (List Text) (List Text)) + ... The Lux runtime shows up as "" + ... so I'm excluding it. + (list.only (|>> text.empty? not))) + +(def: listing_separator + Text + ($_ text\compose text.new_line " ")) + +(def: module_listing + (-> (List Text) Text) + (|>> ..without_lux_runtime + (list.sorted text\<) + (text.join_with ..listing_separator))) + (def: .public (definition name) {#.doc "Looks-up a definition's whole data in the available modules (including the current one)."} (-> Name (Meta Global)) @@ -302,12 +318,10 @@ _ (let [current_module (|> lux (get@ #.current_module) (maybe.else "???")) - separator ($_ text\compose text.new_line " ") all_known_modules (|> lux (get@ #.modules) (list\map product.left) - (list.sorted text\<) - (text.join_with separator))] + ..module_listing)] (#try.Failure ($_ text\compose "Unknown definition: " (name\encode name) text.new_line " Current module: " current_module text.new_line @@ -330,16 +344,15 @@ #.None)))))) list.joined (list.sorted text\<) - (text.join_with separator)) + (text.join_with ..listing_separator)) imports (|> this_module (get@ #.imports) - (list.sorted text\<) - (text.join_with separator)) + ..module_listing) aliases (|> this_module (get@ #.module_aliases) (list\map (function (_ [alias real]) ($_ text\compose alias " => " real))) (list.sorted text\<) - (text.join_with separator))] + (text.join_with ..listing_separator))] ($_ text\compose " Candidates: " candidates text.new_line " Imports: " imports text.new_line diff --git a/stdlib/source/library/lux/target/jvm/reflection.lux b/stdlib/source/library/lux/target/jvm/reflection.lux index 813395886..f68b6b59d 100644 --- a/stdlib/source/library/lux/target/jvm/reflection.lux +++ b/stdlib/source/library/lux/target/jvm/reflection.lux @@ -197,8 +197,8 @@ (#.Some reflection) ... TODO: Instead of having single lower/upper bounds, should ... allow for multiple ones. - (case [(array.read 0 (java/lang/reflect/WildcardType::getLowerBounds reflection)) - (array.read 0 (java/lang/reflect/WildcardType::getUpperBounds reflection))] + (case [(array.read! 0 (java/lang/reflect/WildcardType::getLowerBounds reflection)) + (array.read! 0 (java/lang/reflect/WildcardType::getUpperBounds reflection))] (^template [<pattern> <kind>] [<pattern> (case (ffi.check java/lang/reflect/GenericArrayType bound) diff --git a/stdlib/source/library/lux/tool/compiler/default/platform.lux b/stdlib/source/library/lux/tool/compiler/default/platform.lux index 174058fab..f19ec248c 100644 --- a/stdlib/source/library/lux/tool/compiler/default/platform.lux +++ b/stdlib/source/library/lux/tool/compiler/default/platform.lux @@ -328,10 +328,10 @@ (function (_ mapping) (let [with_dependence+transitives (|> mapping - (dictionary.upsert source ..empty (set.has target)) + (dictionary.revised' source ..empty (set.has target)) (dictionary.revised source (set.union forward)))] (list\fold (function (_ previous) - (dictionary.upsert previous ..empty (set.has target))) + (dictionary.revised' previous ..empty (set.has target))) with_dependence+transitives (set.list backward))))))] (|> dependence @@ -414,7 +414,7 @@ archive.ID <Signal>])]) (:expected - (stm.commit + (stm.commit! (do {! stm.monad} [dependence (if (text\= archive.runtime_module importer) (stm.read dependence) @@ -475,12 +475,12 @@ (in result) (#try.Success [resulting_archive resulting_state]) - (stm.commit (do stm.monad - [[_ [merged_archive _]] (stm.update (function (_ [archive state]) - [(archive.merged resulting_archive archive) - state]) - current)] - (in (#try.Success [merged_archive resulting_state]))))) + (stm.commit! (do stm.monad + [[_ [merged_archive _]] (stm.update (function (_ [archive state]) + [(archive.merged resulting_archive archive) + state]) + current)] + (in (#try.Success [merged_archive resulting_state]))))) _ (async.future (resolver result))] (in [])))] return))))) diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/case.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/case.lux index 454704918..2188bb54a 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/case.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/case.lux @@ -198,11 +198,11 @@ num_tags) num_sub_patterns (list.size sub_patterns) matches (cond (n.< num_subs num_sub_patterns) - (let [[prefix suffix] (list.split (dec num_sub_patterns) subs)] + (let [[prefix suffix] (list.split_at (dec num_sub_patterns) subs)] (list.zipped/2 (list\compose prefix (list (type.tuple suffix))) sub_patterns)) (n.> num_subs num_sub_patterns) - (let [[prefix suffix] (list.split (dec num_subs) sub_patterns)] + (let [[prefix suffix] (list.split_at (dec num_subs) sub_patterns)] (list.zipped/2 subs (list\compose prefix (list (code.tuple suffix))))) ... (n.= num_subs num_sub_patterns) @@ -262,7 +262,7 @@ [[testP nextA] (if (and (n.> num_cases size_sum) (n.= (dec num_cases) idx)) (analyse_pattern #.None - (type.variant (list.drop (dec num_cases) flat_sum)) + (type.variant (list.after (dec num_cases) flat_sum)) (` [(~+ values)]) next) (analyse_pattern #.None caseT (` [(~+ values)]) next))] diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/inference.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/inference.lux index 1a8d43477..af25a5856 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/inference.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/inference.lux @@ -279,7 +279,7 @@ (/.except ..smaller_variant_than_expected [expected_size actual_size]) (n.= boundary tag) - (let [caseT (type.variant (list.drop boundary cases))] + (let [caseT (type.variant (list.after boundary cases))] (///\in (if (n.= 0 depth) (type.function (list caseT) currentT) (let [replace' (replace (|> depth dec (n.* 2)) inferT)] diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/scope.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/scope.lux index ae6034b65..98c36ec05 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/scope.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/analysis/scope.lux @@ -23,8 +23,11 @@ ["." variable (#+ Register Variable)]] ["#" phase]]]]) -(type: Local (Bindings Text [Type Register])) -(type: Foreign (Bindings Text [Type Variable])) +(type: Local + (Bindings Text [Type Register])) + +(type: Foreign + (Bindings Text [Type Variable])) (def: (local? name scope) (-> Text Scope Bit) @@ -79,7 +82,7 @@ (function (_ state) (let [[inner outer] (|> state (get@ #.scopes) - (list.split_when (|>> (reference? name) not)))] + (list.split_when (|>> (reference? name))))] (case outer #.End (#.Right [state #.None]) diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/analysis/jvm.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/analysis/jvm.lux index 4913607a6..6fc53dd20 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/analysis/jvm.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/analysis/jvm.lux @@ -1169,7 +1169,7 @@ [name (index_parameter idx)])) list.reversed) num_owner_tvars (list.size owner_tvars) - owner_tvarsT (|> lux_tvars (list.take num_owner_tvars) (list\map product.right)) + owner_tvarsT (|> lux_tvars (list.first num_owner_tvars) (list\map product.right)) mapping (dictionary.of_list text.hash lux_tvars)] [owner_tvarsT mapping])) diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/extension.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/extension.lux index b59e5ce37..6a5f40ef7 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/extension.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/extension.lux @@ -5,7 +5,7 @@ ["." monad (#+ do)]] [control [parser - ["s" code]]] + ["<.>" code]]] [data [collection ["." list ("#\." functor)]]] @@ -21,7 +21,7 @@ [/// ["#" phase]]]]) -(syntax: (Vector [size s.nat +(syntax: (Vector [size <code>.nat elemT <code>.any]) (in (list (` [(~+ (list.repeated size elemT))])))) @@ -31,8 +31,8 @@ (type: .public (Trinary of) (-> (Vector 3 of) of)) (type: .public (Variadic of) (-> (List of) of)) -(syntax: (arity: [arity s.nat - name s.local_identifier +(syntax: (arity: [arity <code>.nat + name <code>.local_identifier type <code>.any]) (with_identifiers [g!_ g!extension g!name g!phase g!archive g!inputs g!of g!anchor g!expression g!directive] (do {! meta.monad} diff --git a/stdlib/source/library/lux/tool/compiler/meta/io/context.lux b/stdlib/source/library/lux/tool/compiler/meta/io/context.lux index 3e797c325..0c7969507 100644 --- a/stdlib/source/library/lux/tool/compiler/meta/io/context.lux +++ b/stdlib/source/library/lux/tool/compiler/meta/io/context.lux @@ -147,7 +147,7 @@ (if (text.ends_with? ..lux_extension file) (do ! [source_code (\ fs read file)] - (async\in (dictionary.try_put (file.name fs file) source_code enumeration))) + (async\in (dictionary.has' (file.name fs file) source_code enumeration))) (in enumeration))) enumeration)) (\ ! join))] diff --git a/stdlib/source/library/lux/type/check.lux b/stdlib/source/library/lux/type/check.lux index 0201a446a..b4aedaef1 100644 --- a/stdlib/source/library/lux/type/check.lux +++ b/stdlib/source/library/lux/type/check.lux @@ -222,7 +222,7 @@ #.None (..except ..unbound_type_var id)))) -(def: (peek id) +(def: (bound id) (-> Var (Check Type)) (function (_ context) (case (|> context (get@ #.var_bindings) (var::get id)) @@ -404,8 +404,8 @@ (if (!n\= idE idA) (check\in assumptions) (do {! ..monad} - [ebound (attempt (peek idE)) - abound (attempt (peek idA))] + [ebound (attempt (..bound idE)) + abound (attempt (..bound idA))] (case [ebound abound] ... Link the 2 variables circularly [#.None #.None] diff --git a/stdlib/source/library/lux/type/implicit.lux b/stdlib/source/library/lux/type/implicit.lux index d8aeeebb1..6d5195708 100644 --- a/stdlib/source/library/lux/type/implicit.lux +++ b/stdlib/source/library/lux/type/implicit.lux @@ -133,7 +133,7 @@ (do meta.monad [local_batches meta.locals .let [total_locals (list\fold (function (_ [name type] table) - (try.else table (dictionary.try_put name type table))) + (try.else table (dictionary.has' name type table))) (: (Dictionary Text Type) (dictionary.empty text.hash)) (list\join local_batches))]] diff --git a/stdlib/source/library/lux/world/file.lux b/stdlib/source/library/lux/world/file.lux index 293856d25..e6c10352f 100644 --- a/stdlib/source/library/lux/world/file.lux +++ b/stdlib/source/library/lux/world/file.lux @@ -88,8 +88,8 @@ (#.Some last_separator) (do maybe.monad - [[parent temp] (text.split last_separator path) - [_ child] (text.split (text.size /) temp)] + [[parent temp] (text.split_at last_separator path) + [_ child] (text.split_at (text.size /) temp)] (in [parent child]))))) (def: .public (parent fs path) @@ -1193,13 +1193,13 @@ (|>> (<retrieve> separator path) (try\map (function.constant true)) (try.else false))) - stm.commit))] + stm.commit!))] [file? ..retrieve_mock_file!] [directory? ..retrieve_mock_directory!])) (def: (make_directory path) - (stm.commit + (stm.commit! (do {! stm.monad} [|store| (stm.read store)] (case (..make_mock_directory! separator path |store|) @@ -1213,7 +1213,7 @@ (~~ (template [<method> <tag>] [(def: (<method> path) - (stm.commit + (stm.commit! (do stm.monad [|store| (stm.read store)] (in (do try.monad @@ -1233,7 +1233,7 @@ )) (def: (file_size path) - (stm.commit + (stm.commit! (do stm.monad [|store| (stm.read store)] (in (|> |store| @@ -1243,7 +1243,7 @@ binary.size))))))) (def: (last_modified path) - (stm.commit + (stm.commit! (do stm.monad [|store| (stm.read store)] (in (|> |store| @@ -1252,7 +1252,7 @@ (get@ #mock_last_modified)))))))) (def: (can_execute? path) - (stm.commit + (stm.commit! (do stm.monad [|store| (stm.read store)] (in (|> |store| @@ -1261,7 +1261,7 @@ (get@ #mock_can_execute)))))))) (def: (read path) - (stm.commit + (stm.commit! (do stm.monad [|store| (stm.read store)] (in (|> |store| @@ -1270,11 +1270,11 @@ (get@ #mock_content)))))))) (def: (delete path) - (stm.commit + (stm.commit! (..attempt! (..delete_mock_node! separator path) store))) (def: (modify now path) - (stm.commit + (stm.commit! (..attempt! (function (_ |store|) (do try.monad [[name file] (..retrieve_mock_file! separator path |store|)] @@ -1284,13 +1284,13 @@ (def: (write content path) (do async.monad [now (async.future instant.now)] - (stm.commit + (stm.commit! (..attempt! (..update_mock_file! separator path now content) store)))) (def: (append content path) (do async.monad [now (async.future instant.now)] - (stm.commit + (stm.commit! (..attempt! (function (_ |store|) (do try.monad [[name file] (..retrieve_mock_file! separator path |store|)] @@ -1302,7 +1302,7 @@ store)))) (def: (move destination origin) - (stm.commit + (stm.commit! (do {! stm.monad} [|store| (stm.read store)] (case (do try.monad @@ -1333,7 +1333,7 @@ (let [rooted? (text.starts_with? (\ fs separator) path) segments (text.all_split_by (\ fs separator) path)] (case (if rooted? - (list.drop 1 segments) + (list.after 1 segments) segments) #.End (\ monad in (exception.except ..cannot_make_directory [path])) diff --git a/stdlib/source/library/lux/world/file/watch.lux b/stdlib/source/library/lux/world/file/watch.lux index 0bbc37e35..3a0b98f86 100644 --- a/stdlib/source/library/lux/world/file/watch.lux +++ b/stdlib/source/library/lux/world/file/watch.lux @@ -198,17 +198,17 @@ [exists? (\ fs directory? path)] (if exists? (do ! - [updated? (stm.commit (..update_watch! new_concern path tracker))] + [updated? (stm.commit! (..update_watch! new_concern path tracker))] (if updated? (in (#try.Success [])) (do (try.with !) [file_tracker (..file_tracker fs path)] (do ! - [_ (stm.commit (stm.update (dictionary.has path [new_concern file_tracker]) tracker))] + [_ (stm.commit! (stm.update (dictionary.has path [new_concern file_tracker]) tracker))] (in (#try.Success [])))))) (in (exception.except ..cannot_poll_a_non_existent_directory [path]))))) (def: (concern path) - (stm.commit + (stm.commit! (do stm.monad [@tracker (stm.read tracker)] (in (case (dictionary.value path @tracker) @@ -218,7 +218,7 @@ #.None (exception.except ..not_being_watched [path])))))) (def: (stop path) - (stm.commit + (stm.commit! (do {! stm.monad} [@tracker (stm.read tracker)] (case (dictionary.value path @tracker) @@ -231,16 +231,16 @@ (in (exception.except ..not_being_watched [path])))))) (def: (poll _) (do async.monad - [@tracker (stm.commit (stm.read tracker))] + [@tracker (stm.commit! (stm.read tracker))] (do {! (try.with async.monad)} [changes (|> @tracker dictionary.entries (monad.map ! (..available_directory_changes fs))) _ (do async.monad - [_ (stm.commit (stm.write (|> changes - (list\map product.left) - (dictionary.of_list text.hash)) - tracker))] + [_ (stm.commit! (stm.write (|> changes + (list\map product.left) + (dictionary.of_list text.hash)) + tracker))] (in (#try.Success []))) .let [[creations modifications deletions] (list\fold (function (_ [_ [creations modifications deletions]] @@ -425,13 +425,13 @@ stop (: (-> //.Path (Async (Try Concern))) (function (_ path) (do {! async.monad} - [@tracker (stm.commit (stm.read tracker))] + [@tracker (stm.commit! (stm.read tracker))] (case (dictionary.value path @tracker) (#.Some [concern key]) (do ! [_ (async.future (java/nio/file/WatchKey::cancel key)) - _ (stm.commit (stm.update (dictionary.lacks path) tracker))] + _ (stm.commit! (stm.update (dictionary.lacks path) tracker))] (in (#try.Success concern))) #.None @@ -447,11 +447,11 @@ watcher path)] (do async.monad - [_ (stm.commit (stm.update (dictionary.has path [concern key]) tracker))] + [_ (stm.commit! (stm.update (dictionary.has path [concern key]) tracker))] (in (#try.Success [])))))) (def: (concern path) (do async.monad - [@tracker (stm.commit (stm.read tracker))] + [@tracker (stm.commit! (stm.read tracker))] (case (dictionary.value path @tracker) (#.Some [concern key]) (in (#try.Success concern)) diff --git a/stdlib/source/library/lux/world/net/http/header.lux b/stdlib/source/library/lux/world/net/http/header.lux index 76e96c815..5b5a20194 100644 --- a/stdlib/source/library/lux/world/net/http/header.lux +++ b/stdlib/source/library/lux/world/net/http/header.lux @@ -14,13 +14,13 @@ (def: .public (has name value) (-> Text Text Header) - (dictionary.upsert name "" - (|>> (case> - "" - value - - previous - (format previous "," value))))) + (dictionary.revised' name "" + (|>> (case> + "" + value + + previous + (format previous "," value))))) (def: .public content_length (-> Nat Header) diff --git a/stdlib/source/library/lux/world/program.lux b/stdlib/source/library/lux/world/program.lux index 488d0ba36..d5195e39f 100644 --- a/stdlib/source/library/lux/world/program.lux +++ b/stdlib/source/library/lux/world/program.lux @@ -319,7 +319,7 @@ (#.Some process/env) (|> (Object::entries [process/env]) array.list - (list\map (|>> (array.read 0) maybe.assume))) + (list\map (|>> (array.read! 0) maybe.assume))) #.None (list)) @@ -365,8 +365,8 @@ @.js (io.io (if ffi.on_node_js? (case (do maybe.monad [process/env (ffi.constant Object [process env])] - (array.read (:as Nat name) - (:as (Array Text) process/env))) + (array.read! (:as Nat name) + (:as (Array Text) process/env))) (#.Some value) (#try.Success value) diff --git a/stdlib/source/poly/lux/abstract/equivalence.lux b/stdlib/source/poly/lux/abstract/equivalence.lux index 895c8d1a5..805576e18 100644 --- a/stdlib/source/poly/lux/abstract/equivalence.lux +++ b/stdlib/source/poly/lux/abstract/equivalence.lux @@ -45,7 +45,7 @@ (`` (do {! <>.monad} [.let [g!_ (code.local_identifier "_____________")] *env* <type>.env - inputT <type>.peek + inputT <type>.next .let [@Equivalence (: (-> Type Code) (function (_ type) (` ((~! /.Equivalence) (~ (poly.code *env* type))))))]] diff --git a/stdlib/source/poly/lux/abstract/functor.lux b/stdlib/source/poly/lux/abstract/functor.lux index 842c4b66c..db011ca27 100644 --- a/stdlib/source/poly/lux/abstract/functor.lux +++ b/stdlib/source/poly/lux/abstract/functor.lux @@ -30,7 +30,7 @@ funcC (code.local_identifier "____________funcC") inputC (code.local_identifier "____________inputC")] *env* <type>.env - inputT <type>.peek + inputT <type>.next [polyC varsC non_functorT] (<type>.local (list inputT) (<type>.polymorphic <type>.any)) .let [num_vars (list.size varsC)] diff --git a/stdlib/source/poly/lux/data/format/json.lux b/stdlib/source/poly/lux/data/format/json.lux index 3146804e5..a77ef5980 100644 --- a/stdlib/source/poly/lux/data/format/json.lux +++ b/stdlib/source/poly/lux/data/format/json.lux @@ -127,7 +127,7 @@ .let [@JSON\encode (: (-> Type Code) (function (_ type) (` (-> (~ (poly.code *env* type)) /.JSON))))] - inputT <type>.peek] + inputT <type>.next] ($_ <>.either <basic> <time> @@ -250,7 +250,7 @@ .let [@JSON\decode (: (-> Type Code) (function (_ type) (` (</>.Parser (~ (poly.code *env* type))))))] - inputT <type>.peek] + inputT <type>.next] ($_ <>.either <basic> <time> diff --git a/stdlib/source/program/aedifex/hash.lux b/stdlib/source/program/aedifex/hash.lux index 46a6fc67a..63394c8c9 100644 --- a/stdlib/source/program/aedifex/hash.lux +++ b/stdlib/source/program/aedifex/hash.lux @@ -123,7 +123,7 @@ chunk 0 output (binary.empty hash_size)] (let [index (n.* chunk i64.bytes_per_i64)] - (case (text.split ..hex_per_chunk input) + (case (text.split_at ..hex_per_chunk input) (#.Some [head tail]) (do try.monad [head (\ n.hex decode head) diff --git a/stdlib/source/program/aedifex/repository.lux b/stdlib/source/program/aedifex/repository.lux index 8d6d63b3a..914cd1420 100644 --- a/stdlib/source/program/aedifex/repository.lux +++ b/stdlib/source/program/aedifex/repository.lux @@ -51,7 +51,7 @@ (\ mock the_description)) (def: (download uri) - (stm.commit + (stm.commit! (do {! stm.monad} [|state| (stm.read state)] (case (\ mock on_download uri |state|) @@ -64,7 +64,7 @@ (in (#try.Failure error)))))) (def: (upload uri content) - (stm.commit + (stm.commit! (do {! stm.monad} [|state| (stm.read state)] (case (\ mock on_upload uri content |state|) diff --git a/stdlib/source/program/compositor/import.lux b/stdlib/source/program/compositor/import.lux index ca72f9749..5d1eba51c 100644 --- a/stdlib/source/program/compositor/import.lux +++ b/stdlib/source/program/compositor/import.lux @@ -55,7 +55,7 @@ (case entry (#tar.Normal [path instant mode ownership content]) (let [path (tar.from_path path)] - (case (dictionary.try_put path (tar.data content) import) + (case (dictionary.has' path (tar.data content) import) (#try.Failure error) (exception.except ..duplicate [library path]) diff --git a/stdlib/source/specification/compositor/generation/function.lux b/stdlib/source/specification/compositor/generation/function.lux index ad90dbfa0..f4697bd38 100644 --- a/stdlib/source/specification/compositor/generation/function.lux +++ b/stdlib/source/specification/compositor/generation/function.lux @@ -63,8 +63,8 @@ (//case.verify expectation))) (_.test "Can partially apply functions." (or (n.= 1 arity) - (let [preS (list.take partial_arity inputsS) - postS (list.drop partial_arity inputsS) + (let [preS (list.first partial_arity inputsS) + postS (list.after partial_arity inputsS) partialS (synthesis.function/apply {#synthesis.function functionS #synthesis.arguments preS})] (|> (synthesis.function/apply {#synthesis.function partialS diff --git a/stdlib/source/specification/compositor/generation/structure.lux b/stdlib/source/specification/compositor/generation/structure.lux index 0b4bfe4fe..7cd303c52 100644 --- a/stdlib/source/specification/compositor/generation/structure.lux +++ b/stdlib/source/specification/compositor/generation/structure.lux @@ -45,9 +45,9 @@ (case> (#try.Success valueT) (let [valueT (:as (Array Any) valueT)] (and (n.= 3 (array.size valueT)) - (let [tag_out (:as java/lang/Integer (maybe.assume (array.read 0 valueT))) - last?_out (array.read 1 valueT) - value_out (:as Any (maybe.assume (array.read 2 valueT))) + (let [tag_out (:as java/lang/Integer (maybe.assume (array.read! 0 valueT))) + last?_out (array.read! 1 valueT) + value_out (:as Any (maybe.assume (array.read! 2 valueT))) same_tag? (|> tag_out ffi.int_to_long (:as Nat) (n.= tag_in)) same_flag? (case last?_out (#.Some last?_out') diff --git a/stdlib/source/test/aedifex/command/version.lux b/stdlib/source/test/aedifex/command/version.lux index 2bdf72078..c1ab3814e 100644 --- a/stdlib/source/test/aedifex/command/version.lux +++ b/stdlib/source/test/aedifex/command/version.lux @@ -38,7 +38,7 @@ (try.of_maybe (do maybe.monad [head (text.char 0 state) - [_ tail] (text.split 1 state)] + [_ tail] (text.split_at 1 state)] (in [[open? tail] head]))) (exception.except ..console_is_closed! []))) (def: (on_read_line [open? state]) diff --git a/stdlib/source/test/lux.lux b/stdlib/source/test/lux.lux index cf45f0ca5..b2c6790ee 100644 --- a/stdlib/source/test/lux.lux +++ b/stdlib/source/test/lux.lux @@ -49,6 +49,7 @@ ["#." control] ["#." data] ["#." debug] + ["#." documentation] ["#." locale] ["#." macro ["#/." code]] @@ -85,6 +86,7 @@ /control.test /data.test /debug.test + /documentation.test /locale.test /macro.test /math.test diff --git a/stdlib/source/test/lux/abstract/comonad/cofree.lux b/stdlib/source/test/lux/abstract/comonad/cofree.lux index 541977fc5..916d1953b 100644 --- a/stdlib/source/test/lux/abstract/comonad/cofree.lux +++ b/stdlib/source/test/lux/abstract/comonad/cofree.lux @@ -34,8 +34,8 @@ (Comparison (/.CoFree Sequence)) (function (_ == left right) (\ (list.equivalence ==) = - (sequence.take 100 (..interpret left)) - (sequence.take 100 (..interpret right))))) + (sequence.first 100 (..interpret left)) + (sequence.first 100 (..interpret right))))) (def: .public test Test diff --git a/stdlib/source/test/lux/control/concurrency/actor.lux b/stdlib/source/test/lux/control/concurrency/actor.lux index c6b381829..627b294ad 100644 --- a/stdlib/source/test/lux/control/concurrency/actor.lux +++ b/stdlib/source/test/lux/control/concurrency/actor.lux @@ -203,7 +203,7 @@ [num_events (\ ! map (|>> (n.% 10) inc) random.nat) events (random.list num_events random.nat) num_observations (\ ! map (n.% num_events) random.nat) - .let [expected (list.take num_observations events) + .let [expected (list.first num_observations events) sink (: (Atom (Row Nat)) (atom.atom row.empty))]] (in (do async.monad diff --git a/stdlib/source/test/lux/control/concurrency/stm.lux b/stdlib/source/test/lux/control/concurrency/stm.lux index 5ac592494..dbe98177f 100644 --- a/stdlib/source/test/lux/control/concurrency/stm.lux +++ b/stdlib/source/test/lux/control/concurrency/stm.lux @@ -51,52 +51,52 @@ ($monad.spec ..injection ..comparison /.monad)) (in (do async.monad - [actual (/.commit (\ /.monad in expected))] - (_.cover' [/.commit] + [actual (/.commit! (\ /.monad in expected))] + (_.cover' [/.commit!] (n.= expected actual)))) (in (do async.monad - [actual (/.commit (/.read (/.var expected)))] + [actual (/.commit! (/.read (/.var expected)))] (_.cover' [/.Var /.var /.read] (n.= expected actual)))) (in (do async.monad [actual (let [box (/.var dummy)] - (/.commit (do /.monad - [_ (/.write expected box)] - (/.read box)))) + (/.commit! (do /.monad + [_ (/.write expected box)] + (/.read box)))) verdict (let [box (/.var dummy)] - (/.commit (do /.monad - [_ (/.write expected box) - actual (/.read box)] - (in (n.= expected actual)))))] + (/.commit! (do /.monad + [_ (/.write expected box) + actual (/.read box)] + (in (n.= expected actual)))))] (_.cover' [/.write] (and (n.= expected actual) verdict)))) (in (do async.monad [.let [box (/.var dummy)] - output (/.commit (do /.monad - [_ (/.update (n.+ expected) box)] - (/.read box)))] + output (/.commit! (do /.monad + [_ (/.update (n.+ expected) box)] + (/.read box)))] (_.cover' [/.update] (n.= (n.+ expected dummy) output)))) (in (do async.monad [.let [box (/.var dummy) - [follower sink] (io.run! (/.follow box))] - _ (/.commit (/.write expected box)) - _ (/.commit (/.update (n.* 2) box)) + [follower sink] (io.run! (/.follow! box))] + _ (/.commit! (/.write expected box)) + _ (/.commit! (/.update (n.* 2) box)) _ (async.future (\ sink close)) - _ (/.commit (/.update (n.* 3) box)) + _ (/.commit! (/.update (n.* 3) box)) changes (frp.list follower)] - (_.cover' [/.follow] + (_.cover' [/.follow!] (\ (list.equivalence n.equivalence) = (list expected (n.* 2 expected)) changes)))) (in (let [var (/.var 0)] (do {! async.monad} [_ (|> (list.repeated iterations_per_process []) - (list\map (function (_ _) (/.commit (/.update inc var)))) + (list\map (function (_ _) (/.commit! (/.update inc var)))) (monad.seq !)) - cummulative (/.commit (/.read var))] + cummulative (/.commit! (/.read var))] (_.cover' [/.STM] (n.= iterations_per_process cummulative))))) diff --git a/stdlib/source/test/lux/control/parser.lux b/stdlib/source/test/lux/control/parser.lux index d6fa54ee1..bb81f4383 100644 --- a/stdlib/source/test/lux/control/parser.lux +++ b/stdlib/source/test/lux/control/parser.lux @@ -192,7 +192,7 @@ (/.result (/.exactly times <code>.nat)) (match actual (\ (list.equivalence n.equivalence) = - (list.take times expected+) + (list.first times expected+) actual))) (|> (list\map code.nat expected+) (/.result (/.exactly (inc variadic) <code>.nat)) @@ -212,7 +212,7 @@ (/.result (/.at_most times <code>.nat)) (match actual (\ (list.equivalence n.equivalence) = - (list.take times expected+) + (list.first times expected+) actual))) (|> (list\map code.nat expected+) (/.result (/.at_most (inc variadic) <code>.nat)) @@ -227,11 +227,11 @@ (\ (list.equivalence n.equivalence) = expected+ actual))) - (|> (list\map code.nat (list.take times expected+)) + (|> (list\map code.nat (list.first times expected+)) (/.result (/.between times (n.- times variadic) <code>.nat)) (match actual (\ (list.equivalence n.equivalence) = - (list.take times expected+) + (list.first times expected+) actual))))) (_.cover [/.separated_by] (|> (list.interposed (code.text separator) (list\map code.nat expected+)) diff --git a/stdlib/source/test/lux/control/parser/text.lux b/stdlib/source/test/lux/control/parser/text.lux index a7bbfda92..35c509e00 100644 --- a/stdlib/source/test/lux/control/parser/text.lux +++ b/stdlib/source/test/lux/control/parser/text.lux @@ -333,10 +333,10 @@ (..should_fail "" /.any!)))) (do {! random.monad} [expected (random.unicode 1)] - (_.cover [/.peek /.cannot_parse] - (and (..should_pass expected (<>.before /.any /.peek)) + (_.cover [/.next /.cannot_parse] + (and (..should_pass expected (<>.before /.any /.next)) (|> "" - (/.result (<>.before /.any /.peek)) + (/.result (<>.before /.any /.next)) (!expect (^multi (#try.Failure error) (exception.match? /.cannot_parse error))))))) (do {! random.monad} diff --git a/stdlib/source/test/lux/control/parser/type.lux b/stdlib/source/test/lux/control/parser/type.lux index b348c1da2..373d549e9 100644 --- a/stdlib/source/test/lux/control/parser/type.lux +++ b/stdlib/source/test/lux/control/parser/type.lux @@ -198,15 +198,15 @@ (type\= expected actual)))))) (do {! random.monad} [expected ..primitive] - (_.cover [/.peek /.unconsumed_input] + (_.cover [/.next /.unconsumed_input] (and (|> (/.result (do //.monad - [actual /.peek + [actual /.next _ /.any] (in actual)) expected) (!expect (^multi (#try.Success actual) (type\= expected actual)))) - (|> (/.result /.peek expected) + (|> (/.result /.next expected) (!expect (^multi (#try.Failure error) (exception.match? /.unconsumed_input error))))))) (do {! random.monad} @@ -221,7 +221,7 @@ (exception.match? /.empty_input error))))] [/.any] - [/.peek] + [/.next] )))))) (do {! random.monad} [expected ..primitive] diff --git a/stdlib/source/test/lux/control/region.lux b/stdlib/source/test/lux/control/region.lux index ceda7b3a9..4f135a57d 100644 --- a/stdlib/source/test/lux/control/region.lux +++ b/stdlib/source/test/lux/control/region.lux @@ -103,14 +103,14 @@ .let [//@ ! count_clean_up (function (_ value) (do ! - [_ (thread.update inc clean_up_counter)] + [_ (thread.update! inc clean_up_counter)] (in (#try.Success []))))] outcome (/.run! ! (do {! (/.monad !)} - [_ (monad.map ! (/.acquire //@ count_clean_up) + [_ (monad.map ! (/.acquire! //@ count_clean_up) (enum.range n.enum 1 expected_clean_ups))] (in []))) - actual_clean_ups (thread.read clean_up_counter)] + actual_clean_ups (thread.read! clean_up_counter)] (in (and (..success? outcome) (n.= expected_clean_ups actual_clean_ups)))))) @@ -121,15 +121,15 @@ .let [//@ ! count_clean_up (function (_ value) (do ! - [_ (thread.update inc clean_up_counter)] + [_ (thread.update! inc clean_up_counter)] (in (#try.Success []))))] outcome (/.run! ! (do {! (/.monad !)} - [_ (monad.map ! (/.acquire //@ count_clean_up) + [_ (monad.map ! (/.acquire! //@ count_clean_up) (enum.range n.enum 1 expected_clean_ups)) _ (/.failure //@ (exception.error ..oops []))] (in []))) - actual_clean_ups (thread.read clean_up_counter)] + actual_clean_ups (thread.read! clean_up_counter)] (in (and (..throws? ..oops outcome) (n.= expected_clean_ups actual_clean_ups)))))) @@ -140,34 +140,34 @@ .let [//@ ! count_clean_up (function (_ value) (do ! - [_ (thread.update inc clean_up_counter)] + [_ (thread.update! inc clean_up_counter)] (in (#try.Success []))))] outcome (/.run! ! (do {! (/.monad !)} - [_ (monad.map ! (/.acquire //@ count_clean_up) + [_ (monad.map ! (/.acquire! //@ count_clean_up) (enum.range n.enum 1 expected_clean_ups)) _ (/.except //@ ..oops [])] (in []))) - actual_clean_ups (thread.read clean_up_counter)] + actual_clean_ups (thread.read! clean_up_counter)] (in (and (..throws? ..oops outcome) (n.= expected_clean_ups actual_clean_ups)))))) - (_.cover [/.acquire /.clean_up_error] + (_.cover [/.acquire! /.clean_up_error] (thread.result (do {! thread.monad} [clean_up_counter (thread.box 0) .let [//@ ! count_clean_up (function (_ value) (do ! - [_ (thread.update inc clean_up_counter)] + [_ (thread.update! inc clean_up_counter)] (in (: (Try Any) (exception.except ..oops [])))))] outcome (/.run! ! (do {! (/.monad !)} - [_ (monad.map ! (/.acquire //@ count_clean_up) + [_ (monad.map ! (/.acquire! //@ count_clean_up) (enum.range n.enum 1 expected_clean_ups))] (in []))) - actual_clean_ups (thread.read clean_up_counter)] + actual_clean_ups (thread.read! clean_up_counter)] (in (and (or (n.= 0 expected_clean_ups) (..throws? /.clean_up_error outcome)) (n.= expected_clean_ups @@ -179,9 +179,9 @@ .let [//@ !] outcome (/.run! ! (do (/.monad !) - [_ (/.lift //@ (thread.write expected_clean_ups clean_up_counter))] + [_ (/.lift //@ (thread.write! expected_clean_ups clean_up_counter))] (in []))) - actual_clean_ups (thread.read clean_up_counter)] + actual_clean_ups (thread.read! clean_up_counter)] (in (and (..success? outcome) (n.= expected_clean_ups actual_clean_ups)))))) diff --git a/stdlib/source/test/lux/control/thread.lux b/stdlib/source/test/lux/control/thread.lux index 4f71c7203..2f93f2349 100644 --- a/stdlib/source/test/lux/control/thread.lux +++ b/stdlib/source/test/lux/control/thread.lux @@ -57,26 +57,26 @@ (_.for [/.Box /.box] ($_ _.and - (_.cover [/.read] + (_.cover [/.read!] (n.= sample (/.result (: (All [!] (Thread ! Nat)) (do /.monad [box (/.box sample)] - (/.read box)))))) + (/.read! box)))))) - (_.cover [/.write] + (_.cover [/.write!] (n.= factor (/.result (: (All [!] (Thread ! Nat)) (do /.monad [box (/.box sample) - _ (/.write factor box)] - (/.read box)))))) + _ (/.write! factor box)] + (/.read! box)))))) - (_.cover [/.update] + (_.cover [/.update!] (n.= (n.* factor sample) (/.result (: (All [!] (Thread ! Nat)) (do /.monad [box (/.box sample) - old (/.update (n.* factor) box)] - (/.read box)))))))) + old (/.update! (n.* factor) box)] + (/.read! box)))))))) )))) diff --git a/stdlib/source/test/lux/data/binary.lux b/stdlib/source/test/lux/data/binary.lux index d45cc6554..aab56834f 100644 --- a/stdlib/source/test/lux/data/binary.lux +++ b/stdlib/source/test/lux/data/binary.lux @@ -134,16 +134,16 @@ (case offset 0 (not verdict) _ verdict)))) - (_.cover [/.drop] - (and (\ /.equivalence = sample (/.drop 0 sample)) - (\ /.equivalence = (/.empty 0) (/.drop size sample)) + (_.cover [/.after] + (and (\ /.equivalence = sample (/.after 0 sample)) + (\ /.equivalence = (/.empty 0) (/.after size sample)) (case (list.reversed (..as_list sample)) #.End false (#.Item head tail) (n.= (list.fold n.+ 0 tail) - (/.fold n.+ 0 (/.drop 1 sample)))))) + (/.fold n.+ 0 (/.after 1 sample)))))) (_.cover [/.copy] (and (case (/.copy size 0 sample 0 (/.empty size)) (#try.Success output) diff --git a/stdlib/source/test/lux/data/collection/array.lux b/stdlib/source/test/lux/data/collection/array.lux index c7433632e..c1e1471f8 100644 --- a/stdlib/source/test/lux/data/collection/array.lux +++ b/stdlib/source/test/lux/data/collection/array.lux @@ -66,7 +66,7 @@ (n.even? member)) the_array)] [(#.Some expected) (#.Some [idx actual])] - (case (/.read idx the_array) + (case (/.read! idx the_array) (#.Some again) (and (n.= expected actual) (n.= actual again)) @@ -114,12 +114,12 @@ _ false)) - (_.cover [/.read /.write!] + (_.cover [/.read! /.write!] (let [the_array (|> (/.empty 2) (: (Array Nat)) (/.write! 0 expected))] - (case [(/.read 0 the_array) - (/.read 1 the_array)] + (case [(/.read! 0 the_array) + (/.read! 1 the_array)] [(#.Some actual) #.None] (n.= expected actual) @@ -129,8 +129,8 @@ (let [the_array (|> (/.empty 1) (: (Array Nat)) (/.write! 0 expected))] - (case [(/.read 0 the_array) - (/.read 0 (/.delete! 0 the_array))] + (case [(/.read! 0 the_array) + (/.read! 0 (/.delete! 0 the_array))] [(#.Some actual) #.None] (n.= expected actual) @@ -148,7 +148,7 @@ (: (Array Nat)) (/.write! 0 base) (/.update! 0 (n.+ shift)))] - (case (/.read 0 the_array) + (case (/.read! 0 the_array) (#.Some actual) (n.= expected actual) @@ -160,8 +160,8 @@ (/.write! 0 base) (/.upsert! 0 dummy (n.+ shift)) (/.upsert! 1 base (n.+ shift)))] - (case [(/.read 0 the_array) - (/.read 1 the_array)] + (case [(/.read! 0 the_array) + (/.read! 1 the_array)] [(#.Some actual/0) (#.Some actual/1)] (and (n.= expected actual/0) (n.= expected actual/1)) @@ -195,7 +195,7 @@ (/.empty size))] (exec (/.copy! amount 0 the_array 0 copy) (\ (list.equivalence n.equivalence) = - (list.take amount (/.list the_array)) + (list.first amount (/.list the_array)) (/.list copy)))))) (_.cover [/.clone] (let [clone (/.clone the_array)] diff --git a/stdlib/source/test/lux/data/collection/dictionary.lux b/stdlib/source/test/lux/data/collection/dictionary.lux index 7114a2eed..82e421d28 100644 --- a/stdlib/source/test/lux/data/collection/dictionary.lux +++ b/stdlib/source/test/lux/data/collection/dictionary.lux @@ -161,9 +161,9 @@ (#.Some v) (n.= test_val v) _ true))) - (_.cover [/.try_put /.key_already_exists] + (_.cover [/.has' /.key_already_exists] (let [can_put_new_keys! - (case (/.try_put non_key test_val dict) + (case (/.has' non_key test_val dict) (#try.Success dict) (case (/.value non_key dict) (#.Some v) (n.= test_val v) @@ -175,7 +175,7 @@ cannot_put_old_keys! (or (n.= 0 size) (let [first_key (|> dict /.keys list.head maybe.assume)] - (case (/.try_put first_key test_val dict) + (case (/.has' first_key test_val dict) (#try.Success _) false @@ -206,9 +206,9 @@ _ false))) - (_.cover [/.upsert] + (_.cover [/.revised'] (let [can_upsert_new_key! - (case (/.value non_key (/.upsert non_key test_val inc dict)) + (case (/.value non_key (/.revised' non_key test_val inc dict)) (#.Some inserted) (n.= (inc test_val) inserted) @@ -221,7 +221,7 @@ true (#.Some [known_key known_value]) - (case (/.value known_key (/.upsert known_key test_val inc dict)) + (case (/.value known_key (/.revised' known_key test_val inc dict)) (#.Some updated) (n.= (inc known_value) updated) @@ -237,10 +237,10 @@ /.size (n.= 1))) - (_.cover [/.re_bind] + (_.cover [/.re_bound] (or (n.= 0 size) (let [first_key (|> dict /.keys list.head maybe.assume) - rebound (/.re_bind first_key non_key dict)] + rebound (/.re_bound first_key non_key dict)] (and (n.= (/.size dict) (/.size rebound)) (/.key? rebound non_key) (not (/.key? rebound first_key)) diff --git a/stdlib/source/test/lux/data/collection/list.lux b/stdlib/source/test/lux/data/collection/list.lux index 7fb1e8704..ce86a80c7 100644 --- a/stdlib/source/test/lux/data/collection/list.lux +++ b/stdlib/source/test/lux/data/collection/list.lux @@ -202,18 +202,18 @@ positives) (/\= (/.only (bit.complement n.even?) sample) negatives)))) - (_.cover [/.split] - (let [[left right] (/.split idx sample)] + (_.cover [/.split_at] + (let [[left right] (/.split_at idx sample)] (/\= sample (/\compose left right)))) (_.cover [/.split_when] (let [[left right] (/.split_when n.even? sample)] (/\= sample (/\compose left right)))) - (_.cover [/.take /.drop] + (_.cover [/.first /.after] (/\= sample - (/\compose (/.take idx sample) - (/.drop idx sample)))) + (/\compose (/.first idx sample) + (/.after idx sample)))) (_.cover [/.while /.until] (/\= sample (/\compose (/.while n.even? sample) @@ -292,9 +292,9 @@ (n.min (/.size sample/0) (/.size sample/1))) can_extract_values! - (and (/\= (/.take zipped::size sample/0) + (and (/\= (/.first zipped::size sample/0) (/\map product.left zipped)) - (/\= (/.take zipped::size sample/1) + (/\= (/.first zipped::size sample/1) (/\map product.right zipped)))] (and size_of_smaller_list! can_extract_values!))) @@ -310,11 +310,11 @@ (/.size sample/2))) can_extract_values! - (and (/\= (/.take zipped::size sample/0) + (and (/\= (/.first zipped::size sample/0) (/\map product.left zipped)) - (/\= (/.take zipped::size sample/1) + (/\= (/.first zipped::size sample/1) (/\map (|>> product.right product.left) zipped)) - (/\= (/.take zipped::size sample/2) + (/\= (/.first zipped::size sample/2) (/\map (|>> product.right product.right) zipped)))] (and size_of_smaller_list! can_extract_values!))) @@ -424,7 +424,7 @@ 0))))) (_.cover [/.folds] (/\= (/\map (function (_ index) - (\ /.fold fold n.+ 0 (/.take index sample))) + (\ /.fold fold n.+ 0 (/.first index sample))) (/.indices (inc (/.size sample)))) (/.folds n.+ 0 sample))) (do random.monad diff --git a/stdlib/source/test/lux/data/collection/queue.lux b/stdlib/source/test/lux/data/collection/queue.lux index 33ec7d9ba..5fcec5102 100644 --- a/stdlib/source/test/lux/data/collection/queue.lux +++ b/stdlib/source/test/lux/data/collection/queue.lux @@ -58,8 +58,8 @@ /.empty))] (and empty_is_empty! all_empty_queues_look_the_same!))) - (_.cover [/.peek] - (case [members (/.peek sample)] + (_.cover [/.front] + (case [members (/.front sample)] [(#.Item head tail) (#.Some first)] (n.= head first) @@ -77,8 +77,8 @@ (not (/.member? n.equivalence sample non_member))] (and every_member_is_identified! non_member_is_not_identified!))) - (_.cover [/.push] - (let [pushed (/.push non_member sample) + (_.cover [/.end] + (let [pushed (/.end non_member sample) size_increases! (n.= (inc (/.size sample)) (/.size pushed)) @@ -93,10 +93,10 @@ (and size_increases! new_member_is_identified! has_expected_order!))) - (_.cover [/.pop] + (_.cover [/.next] (case members (#.Item target expected) - (let [popped (/.pop sample) + (let [popped (/.next sample) size_decreases! (n.= (dec (/.size sample)) @@ -115,5 +115,5 @@ #.End (and (/.empty? sample) - (/.empty? (/.pop sample))))) + (/.empty? (/.next sample))))) )))) diff --git a/stdlib/source/test/lux/data/collection/queue/priority.lux b/stdlib/source/test/lux/data/collection/queue/priority.lux index 20579c5b6..4faaaf488 100644 --- a/stdlib/source/test/lux/data/collection/queue/priority.lux +++ b/stdlib/source/test/lux/data/collection/queue/priority.lux @@ -22,7 +22,7 @@ (monad.fold ! (function (_ head tail) (do ! [priority random.nat] - (in (/.push priority head tail)))) + (in (/.end priority head tail)))) /.empty inputs))) @@ -47,28 +47,28 @@ (/.empty? sample))) (_.cover [/.empty] (/.empty? /.empty)) - (_.cover [/.peek] - (case (/.peek sample) + (_.cover [/.front] + (case (/.front sample) (#.Some first) (n.> 0 (/.size sample)) #.None (/.empty? sample))) (_.cover [/.member?] - (case (/.peek sample) + (case (/.front sample) (#.Some first) (/.member? n.equivalence sample first) #.None (/.empty? sample))) - (_.cover [/.push] - (let [sample+ (/.push non_member_priority non_member sample)] + (_.cover [/.end] + (let [sample+ (/.end non_member_priority non_member sample)] (and (not (/.member? n.equivalence sample non_member)) (n.= (inc (/.size sample)) (/.size sample+)) (/.member? n.equivalence sample+ non_member)))) - (_.cover [/.pop] - (let [sample- (/.pop sample)] + (_.cover [/.next] + (let [sample- (/.next sample)] (or (and (/.empty? sample) (/.empty? sample-)) (n.= (dec (/.size sample)) @@ -77,17 +77,17 @@ ($_ _.and (_.cover [/.max] (|> /.empty - (/.push /.min min_member) - (/.push /.max max_member) - /.peek + (/.end /.min min_member) + (/.end /.max max_member) + /.front (maybe\map (n.= max_member)) (maybe.else false))) (_.cover [/.min] (|> /.empty - (/.push /.max max_member) - (/.push /.min min_member) - /.pop - /.peek + (/.end /.max max_member) + (/.end /.min min_member) + /.next + /.front (maybe\map (n.= min_member)) (maybe.else false))) )) diff --git a/stdlib/source/test/lux/data/collection/sequence.lux b/stdlib/source/test/lux/data/collection/sequence.lux index 9a2c78afb..19183f1b1 100644 --- a/stdlib/source/test/lux/data/collection/sequence.lux +++ b/stdlib/source/test/lux/data/collection/sequence.lux @@ -26,8 +26,8 @@ (def: (= reference subject) (\ (list.equivalence super) = - (/.take 100 reference) - (/.take 100 subject)))) + (/.first 100 reference) + (/.first 100 subject)))) (def: .public test Test @@ -53,18 +53,18 @@ (_.cover [/.repeated] (n.= repeated (/.item index (/.repeated repeated)))) - (_.cover [/.take] + (_.cover [/.first] (list\= (enum.range n.enum offset (dec (n.+ size offset))) - (/.take size (/.iterations inc offset)))) - (_.cover [/.drop] + (/.first size (/.iterations inc offset)))) + (_.cover [/.after] (list\= (enum.range n.enum offset (dec (n.+ size offset))) - (/.take size (/.drop offset (/.iterations inc 0))))) - (_.cover [/.split] - (let [[drops takes] (/.split size (/.iterations inc 0))] + (/.first size (/.after offset (/.iterations inc 0))))) + (_.cover [/.split_at] + (let [[drops takes] (/.split_at size (/.iterations inc 0))] (and (list\= (enum.range n.enum 0 (dec size)) drops) (list\= (enum.range n.enum size (dec (n.* 2 size))) - (/.take size takes))))) + (/.first size takes))))) (_.cover [/.while] (list\= (enum.range n.enum 0 (dec size)) (/.while (n.< size) (/.iterations inc 0)))) @@ -83,10 +83,10 @@ (/.head (/.iterations inc offset)))) (_.cover [/.tail] (list\= (enum.range n.enum (inc offset) (n.+ size offset)) - (/.take size (/.tail (/.iterations inc offset))))) + (/.first size (/.tail (/.iterations inc offset))))) (_.cover [/.only] (list\= (list\map (n.* 2) (enum.range n.enum 0 (dec size))) - (/.take size (/.only n.even? (/.iterations inc 0))))) + (/.first size (/.only n.even? (/.iterations inc 0))))) (_.cover [/.partition] (let [[evens odds] (/.partition n.even? (/.iterations inc 0))] (and (n.= (n.* 2 offset) @@ -96,16 +96,16 @@ (_.cover [/.unfold] (let [(^open "/\.") /.functor (^open "list\.") (list.equivalence text.equivalence)] - (list\= (/.take size - (/\map %.nat (/.iterations inc offset))) - (/.take size - (/.unfold (function (_ n) [(inc n) (%.nat n)]) - offset))))) + (list\= (/.first size + (/\map %.nat (/.iterations inc offset))) + (/.first size + (/.unfold (function (_ n) [(inc n) (%.nat n)]) + offset))))) (_.cover [/.cycle] (let [cycle (list& cycle_start cycle_next)] (list\= (list.joined (list.repeated size cycle)) - (/.take (n.* size (list.size cycle)) - (/.cycle [cycle_start cycle_next]))))) + (/.first (n.* size (list.size cycle)) + (/.cycle [cycle_start cycle_next]))))) (_.cover [/.^sequence&] (let [(/.^sequence& first second third next) (/.iterations inc offset)] (and (n.= offset first) diff --git a/stdlib/source/test/lux/data/collection/stack.lux b/stdlib/source/test/lux/data/collection/stack.lux index 591308f56..79355156f 100644 --- a/stdlib/source/test/lux/data/collection/stack.lux +++ b/stdlib/source/test/lux/data/collection/stack.lux @@ -20,7 +20,7 @@ (def: (injection value) (Injection /.Stack) - (/.push value /.empty)) + (/.top value /.empty)) (def: .public test Test @@ -43,24 +43,24 @@ (/.empty? sample))) (_.cover [/.empty] (/.empty? /.empty)) - (_.cover [/.peek] - (case (/.peek sample) + (_.cover [/.value] + (case (/.value sample) #.None (/.empty? sample) (#.Some _) (not (/.empty? sample)))) - (_.cover [/.pop] - (case (/.pop sample) + (_.cover [/.next] + (case (/.next sample) #.None (/.empty? sample) (#.Some [top remaining]) (\ (/.equivalence n.equivalence) = sample - (/.push top remaining)))) - (_.cover [/.push] - (case (/.pop (/.push expected_top sample)) + (/.top top remaining)))) + (_.cover [/.top] + (case (/.next (/.top expected_top sample)) (#.Some [actual_top actual_sample]) (and (same? expected_top actual_top) (same? sample actual_sample)) diff --git a/stdlib/source/test/lux/data/text.lux b/stdlib/source/test/lux/data/text.lux index f95757333..1efa4ebfe 100644 --- a/stdlib/source/test/lux/data/text.lux +++ b/stdlib/source/test/lux/data/text.lux @@ -288,8 +288,8 @@ .let [sample (/.joined (list sampleL sampleR)) (^open "/\.") /.equivalence]] ($_ _.and - (_.cover [/.split] - (|> (/.split sizeL sample) + (_.cover [/.split_at] + (|> (/.split_at sizeL sample) (case> (#.Right [_l _r]) (and (/\= sampleL _l) (/\= sampleR _r) diff --git a/stdlib/source/test/lux/documentation.lux b/stdlib/source/test/lux/documentation.lux new file mode 100644 index 000000000..b8a34a752 --- /dev/null +++ b/stdlib/source/test/lux/documentation.lux @@ -0,0 +1,93 @@ +(.module: + [library + [lux #* + ["_" test (#+ Test)] + [control + ["." try] + ["." exception] + [parser + ["<.>" code]]] + [data + ["." text ("#\." equivalence)] + [format + ["md" markdown]]] + ["." macro + [syntax (#+ syntax:)] + ["." template] + ["." code]]]] + [\\library + ["." /]]) + +(syntax: (macro_error [macro <code>.any]) + (function (_ compiler) + (case ((macro.expansion macro) compiler) + (#try.Failure error) + (#try.Success [compiler (list (code.text error))]) + + (#try.Success _) + (#try.Failure "OOPS!")))) + +(template.with_locals [g!default + g!description] + (as_is (def: g!default + Nat + 123) + + (`` (/.documentation: /.documentation: + (~~ (template.text [g!description])))) + + (def: .public test + Test + (<| (_.covering /._) + ($_ _.and + (_.for [/.Definition] + ($_ _.and + (_.cover [/.default] + (let [definition (`` (/.default (~~ (template.identifier [.._] [g!default]))))] + (and (|> definition + (get@ #/.definition) + (text\= (template.text [g!default]))) + (|> definition + (get@ #/.documentation) + md.markdown + (text\= "") + not)))) + (_.cover [/.documentation:] + (and (|> ..documentation: + (get@ #/.definition) + (text\= (template.text [/.documentation:]))) + (|> ..documentation: + (get@ #/.documentation) + md.markdown + (text.contains? (template.text [g!description])) + not))) + )) + (_.for [/.Module] + ($_ _.and + (_.cover [/.module /.documentation] + (let [sub (/.module /._ + [] + []) + super (/.module .._ + [..documentation:] + [sub])] + (and (text.contains? (/.documentation sub) + (/.documentation super)) + (text.contains? (md.markdown (get@ #/.documentation ..documentation:)) + (/.documentation super))))) + )) + (_.cover [/.unqualified_identifier] + (`` (and (~~ (template [<example>] + [(<| (text.contains? (get@ #exception.label /.unqualified_identifier)) + macro_error + <example>)] + + [(/.default g!default)] + [(/.documentation: g!default + (~~ (template.text [g!description])))] + [(/.module g!default + [..documentation:] + [sub])] + ))))) + )))) + ) diff --git a/stdlib/source/test/lux/meta.lux b/stdlib/source/test/lux/meta.lux index b8e3e1c76..1403d6ee8 100644 --- a/stdlib/source/test/lux/meta.lux +++ b/stdlib/source/test/lux/meta.lux @@ -653,8 +653,8 @@ all_tags (|> random_tag (random.set name.hash 10) (\ ! map set.list)) - .let [tags_0 (list.take 5 all_tags) - tags_1 (list.drop 5 all_tags) + .let [tags_0 (list.first 5 all_tags) + tags_1 (list.after 5 all_tags) type_0 (#.Primitive name_0 (list)) type_1 (#.Primitive name_1 (list)) diff --git a/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/case.lux b/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/case.lux index 3f975a006..f694d0629 100644 --- a/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/case.lux +++ b/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/case.lux @@ -179,8 +179,8 @@ (_.test "Can analyse exhaustive pattern-matching." (|> (analyse_pm exhaustive_branchesC) _structure.check_succeeds)) - (let [non_exhaustive_branchesC (list.take (dec (list.size exhaustive_branchesC)) - exhaustive_branchesC)] + (let [non_exhaustive_branchesC (list.first (dec (list.size exhaustive_branchesC)) + exhaustive_branchesC)] (_.test "Will reject non-exhaustive pattern-matching." (|> (analyse_pm non_exhaustive_branchesC) _structure.check_fails))) @@ -189,9 +189,9 @@ redundancy_idx (|> r.nat (\ ! map (n.% (list.size redundant_patterns)))) .let [redundant_branchesC (<| (list!map (branch outputC)) list.joined - (list (list.take redundancy_idx redundant_patterns) + (list (list.first redundancy_idx redundant_patterns) (list (maybe.assume (list.item redundancy_idx redundant_patterns))) - (list.drop redundancy_idx redundant_patterns)))]] + (list.after redundancy_idx redundant_patterns)))]] (_.test "Will reject redundant pattern-matching." (|> (analyse_pm redundant_branchesC) _structure.check_fails))) @@ -199,10 +199,10 @@ [[heterogeneousT heterogeneousC] (r.only (|>> product.left (check.subsumes? outputT) not) _primitive.primitive) heterogeneous_idx (|> r.nat (\ ! map (n.% (list.size exhaustive_patterns)))) - .let [heterogeneous_branchesC (list.joined (list (list.take heterogeneous_idx exhaustive_branchesC) + .let [heterogeneous_branchesC (list.joined (list (list.first heterogeneous_idx exhaustive_branchesC) (list (let [[_pattern _body] (maybe.assume (list.item heterogeneous_idx exhaustive_branchesC))] [_pattern heterogeneousC])) - (list.drop (inc heterogeneous_idx) exhaustive_branchesC)))]] + (list.after (inc heterogeneous_idx) exhaustive_branchesC)))]] (_.test "Will reject pattern-matching if the bodies of the branches do not all have the same type." (|> (analyse_pm heterogeneous_branchesC) _structure.check_fails))) diff --git a/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/function.lux b/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/function.lux index 3213443a6..b0027b15d 100644 --- a/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/function.lux +++ b/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/function.lux @@ -61,21 +61,21 @@ ($_ _.and (_.test "Can analyse function." (and (|> (//type.with_type (All [a] (-> a outputT)) - (/.function _primitive.phase func_name arg_name archive.empty outputC)) + (/.function _primitive.phase func_name arg_name archive.empty outputC)) _structure.check_succeeds) (|> (//type.with_type (All [a] (-> a a)) - (/.function _primitive.phase func_name arg_name archive.empty g!arg)) + (/.function _primitive.phase func_name arg_name archive.empty g!arg)) _structure.check_succeeds))) (_.test "Generic functions can always be specialized." (and (|> (//type.with_type (-> inputT outputT) - (/.function _primitive.phase func_name arg_name archive.empty outputC)) + (/.function _primitive.phase func_name arg_name archive.empty outputC)) _structure.check_succeeds) (|> (//type.with_type (-> inputT inputT) - (/.function _primitive.phase func_name arg_name archive.empty g!arg)) + (/.function _primitive.phase func_name arg_name archive.empty g!arg)) _structure.check_succeeds))) (_.test "The function's name is bound to the function's type." (|> (//type.with_type (Rec self (-> inputT self)) - (/.function _primitive.phase func_name arg_name archive.empty (code.local_identifier func_name))) + (/.function _primitive.phase func_name arg_name archive.empty (code.local_identifier func_name))) _structure.check_succeeds)) )))) @@ -89,15 +89,15 @@ inputsC (list\map product.right inputsTC)] [outputT outputC] _primitive.primitive .let [funcT (type.function inputsT outputT) - partialT (type.function (list.drop partial_args inputsT) outputT) + partialT (type.function (list.after partial_args inputsT) outputT) varT (#.Parameter 1) polyT (<| (type.univ_q 1) - (type.function (list.joined (list (list.take var_idx inputsT) + (type.function (list.joined (list (list.first var_idx inputsT) (list varT) - (list.drop (inc var_idx) inputsT)))) + (list.after (inc var_idx) inputsT)))) varT) poly_inputT (maybe.assume (list.item var_idx inputsT)) - partial_poly_inputsT (list.drop (inc var_idx) inputsT) + partial_poly_inputsT (list.after (inc var_idx) inputsT) partial_polyT1 (<| (type.function partial_poly_inputsT) poly_inputT) partial_polyT2 (<| (type.univ_q 1) @@ -110,16 +110,16 @@ (|> (/.apply _primitive.phase inputsC funcT dummy_function archive.empty (' [])) (check_apply outputT full_args))) (_.test "Can partially apply functions." - (|> (/.apply _primitive.phase (list.take partial_args inputsC) funcT dummy_function archive.empty (' [])) + (|> (/.apply _primitive.phase (list.first partial_args inputsC) funcT dummy_function archive.empty (' [])) (check_apply partialT partial_args))) (_.test "Can apply polymorphic functions." (|> (/.apply _primitive.phase inputsC polyT dummy_function archive.empty (' [])) (check_apply poly_inputT full_args))) (_.test "Polymorphic partial application propagates found type-vars." - (|> (/.apply _primitive.phase (list.take (inc var_idx) inputsC) polyT dummy_function archive.empty (' [])) + (|> (/.apply _primitive.phase (list.first (inc var_idx) inputsC) polyT dummy_function archive.empty (' [])) (check_apply partial_polyT1 (inc var_idx)))) (_.test "Polymorphic partial application preserves quantification for type-vars." - (|> (/.apply _primitive.phase (list.take var_idx inputsC) polyT dummy_function archive.empty (' [])) + (|> (/.apply _primitive.phase (list.first var_idx inputsC) polyT dummy_function archive.empty (' [])) (check_apply partial_polyT2 var_idx))) )))) diff --git a/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/structure.lux b/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/structure.lux index 9aa837e50..bc4890efe 100644 --- a/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/structure.lux +++ b/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/structure.lux @@ -126,9 +126,9 @@ .let [variantT (type.variant (list\map product.left primitives)) [valueT valueC] (maybe.assume (list.item choice primitives)) +size (inc size) - +primitives (list.joined (list (list.take choice primitives) + +primitives (list.joined (list (list.first choice primitives) (list [(#.Parameter 1) +valueC]) - (list.drop choice primitives))) + (list.after choice primitives))) [+valueT +valueC] (maybe.assume (list.item +choice +primitives)) +variantT (type.variant (list\map product.left +primitives))]] (<| (_.context (%.name (name_of /.sum))) @@ -176,9 +176,9 @@ [_ +valueC] _primitive.primitive .let [tupleT (type.tuple (list\map product.left primitives)) [singletonT singletonC] (|> primitives (list.item choice) maybe.assume) - +primitives (list.joined (list (list.take choice primitives) + +primitives (list.joined (list (list.first choice primitives) (list [(#.Parameter 1) +valueC]) - (list.drop choice primitives))) + (list.after choice primitives))) +tupleT (type.tuple (list\map product.left +primitives))]] (<| (_.context (%.name (name_of /.product))) ($_ _.and @@ -243,9 +243,9 @@ [choiceT choiceC] (maybe.assume (list.item choice primitives)) [other_choiceT other_choiceC] (maybe.assume (list.item other_choice primitives)) monoT (type.variant primitivesT) - polyT (|> (type.variant (list.joined (list (list.take choice primitivesT) + polyT (|> (type.variant (list.joined (list (list.first choice primitivesT) (list varT) - (list.drop (inc choice) primitivesT)))) + (list.after (inc choice) primitivesT)))) (type.univ_q 1)) choice_tag (maybe.assume (list.item choice tags)) other_choice_tag (maybe.assume (list.item other_choice tags))]] @@ -288,9 +288,9 @@ primitivesC (list\map product.right primitives) monoT (#.Named [module_name type_name] (type.tuple primitivesT)) recordC (list.zipped/2 tagsC primitivesC) - polyT (|> (type.tuple (list.joined (list (list.take choice primitivesT) + polyT (|> (type.tuple (list.joined (list (list.first choice primitivesT) (list varT) - (list.drop (inc choice) primitivesT)))) + (list.after (inc choice) primitivesT)))) (type.univ_q 1) (#.Named [module_name type_name]))]] (<| (_.context (%.name (name_of /.record))) diff --git a/stdlib/source/test/lux/world/console.lux b/stdlib/source/test/lux/world/console.lux index 1198e56bb..5a8c28ad7 100644 --- a/stdlib/source/test/lux/world/console.lux +++ b/stdlib/source/test/lux/world/console.lux @@ -26,7 +26,7 @@ (def: (on_read [dead? content]) (do try.monad [char (try.of_maybe (text.char 0 content)) - [_ content] (try.of_maybe (text.split 1 content))] + [_ content] (try.of_maybe (text.split_at 1 content))] (if dead? (exception.except ..dead []) (in [[dead? content] char])))) |