From 2a05d8f3711d2e1b6fcccd9a2869478197386a7f Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Sat, 6 Apr 2019 23:11:20 -0400 Subject: Moved "lux/cli", "lux/io" and "lux/function" under "lux/control". --- stdlib/source/lux/abstract/order.lux | 5 +- stdlib/source/lux/abstract/predicate.lux | 15 +- stdlib/source/lux/cli.lux | 176 --------------------- stdlib/source/lux/control/cli.lux | 176 +++++++++++++++++++++ stdlib/source/lux/control/concurrency/actor.lux | 6 +- stdlib/source/lux/control/concurrency/atom.lux | 5 +- stdlib/source/lux/control/concurrency/frp.lux | 4 +- stdlib/source/lux/control/concurrency/process.lux | 4 +- stdlib/source/lux/control/concurrency/promise.lux | 7 +- .../source/lux/control/concurrency/semaphore.lux | 3 +- stdlib/source/lux/control/concurrency/stm.lux | 3 +- stdlib/source/lux/control/continuation.lux | 3 +- stdlib/source/lux/control/function.lux | 40 +++++ stdlib/source/lux/control/io.lux | 65 ++++++++ stdlib/source/lux/control/security/capability.lux | 2 +- stdlib/source/lux/control/thread.lux | 5 +- stdlib/source/lux/data/bit.lux | 3 +- stdlib/source/lux/data/identity.lux | 3 +- stdlib/source/lux/data/lazy.lux | 2 +- stdlib/source/lux/data/number/nat.lux | 5 +- stdlib/source/lux/data/number/ratio.lux | 2 +- stdlib/source/lux/data/number/rev.lux | 5 +- stdlib/source/lux/function.lux | 40 ----- stdlib/source/lux/host.jvm.lux | 8 +- stdlib/source/lux/host/jvm/loader.jvm.lux | 2 +- stdlib/source/lux/host/scheme.lux | 4 +- stdlib/source/lux/io.lux | 65 -------- stdlib/source/lux/macro/poly.lux | 4 +- stdlib/source/lux/macro/syntax/common/writer.lux | 3 +- stdlib/source/lux/test.lux | 4 +- stdlib/source/lux/time/instant.lux | 2 +- stdlib/source/lux/tool/compiler/analysis.lux | 5 +- stdlib/source/lux/tool/compiler/phase.lux | 4 +- .../source/lux/tool/compiler/phase/extension.lux | 4 +- .../tool/compiler/phase/generation/js/runtime.lux | 2 +- .../phase/generation/python/extension/common.lux | 3 +- .../compiler/phase/generation/python/runtime.lux | 2 +- .../phase/generation/scheme/runtime.jvm.lux | 2 +- stdlib/source/lux/type/resource.lux | 4 +- stdlib/source/lux/world/file.lux | 2 +- stdlib/source/lux/world/net/tcp.jvm.lux | 2 +- stdlib/source/lux/world/net/udp.jvm.lux | 2 +- stdlib/source/test/lux.lux | 18 +-- stdlib/source/test/lux/abstract/apply.lux | 3 +- stdlib/source/test/lux/abstract/enum.lux | 3 +- stdlib/source/test/lux/abstract/functor.lux | 3 +- stdlib/source/test/lux/abstract/monad.lux | 3 +- stdlib/source/test/lux/abstract/monoid.lux | 5 +- stdlib/source/test/lux/cli.lux | 75 --------- stdlib/source/test/lux/control.lux | 7 +- stdlib/source/test/lux/control/cli.lux | 75 +++++++++ .../source/test/lux/control/concurrency/actor.lux | 8 +- .../source/test/lux/control/concurrency/atom.lux | 5 +- stdlib/source/test/lux/control/concurrency/frp.lux | 10 +- .../test/lux/control/concurrency/promise.lux | 4 +- .../test/lux/control/concurrency/semaphore.lux | 2 +- stdlib/source/test/lux/control/concurrency/stm.lux | 14 +- stdlib/source/test/lux/control/io.lux | 42 +++++ stdlib/source/test/lux/control/reader.lux | 7 +- stdlib/source/test/lux/control/region.lux | 8 +- stdlib/source/test/lux/control/state.lux | 4 +- stdlib/source/test/lux/control/writer.lux | 3 +- stdlib/source/test/lux/data/bit.lux | 5 +- stdlib/source/test/lux/data/collection/bits.lux | 4 +- stdlib/source/test/lux/data/collection/list.lux | 4 +- stdlib/source/test/lux/data/error.lux | 4 +- stdlib/source/test/lux/data/maybe.lux | 2 +- stdlib/source/test/lux/host/jvm.jvm.lux | 2 +- stdlib/source/test/lux/io.lux | 41 ----- stdlib/source/test/lux/math.lux | 117 +++++++------- stdlib/source/test/lux/math/infix.lux | 2 +- stdlib/source/test/lux/type/resource.lux | 3 +- stdlib/source/test/lux/world/file.lux | 2 +- stdlib/source/test/lux/world/net/tcp.lux | 2 +- stdlib/source/test/lux/world/net/udp.lux | 2 +- 75 files changed, 610 insertions(+), 582 deletions(-) delete mode 100644 stdlib/source/lux/cli.lux create mode 100644 stdlib/source/lux/control/cli.lux create mode 100644 stdlib/source/lux/control/function.lux create mode 100644 stdlib/source/lux/control/io.lux delete mode 100644 stdlib/source/lux/function.lux delete mode 100644 stdlib/source/lux/io.lux delete mode 100644 stdlib/source/test/lux/cli.lux create mode 100644 stdlib/source/test/lux/control/cli.lux create mode 100644 stdlib/source/test/lux/control/io.lux delete mode 100644 stdlib/source/test/lux/io.lux (limited to 'stdlib/source') diff --git a/stdlib/source/lux/abstract/order.lux b/stdlib/source/lux/abstract/order.lux index 85b33fa18..32df7d1af 100644 --- a/stdlib/source/lux/abstract/order.lux +++ b/stdlib/source/lux/abstract/order.lux @@ -1,6 +1,7 @@ (.module: [lux #* - function] + [control + ["." function]]] [// [functor (#+ Contravariant)] ["." equivalence (#+ Equivalence)]]) @@ -21,7 +22,7 @@ (def: #export (order equivalence <) (All [a] (-> (Equivalence a) (-> a a Bit) (Order a))) - (let [> (flip <)] + (let [> (function.flip <)] (structure (def: &equivalence equivalence) (def: < <) diff --git a/stdlib/source/lux/abstract/predicate.lux b/stdlib/source/lux/abstract/predicate.lux index faa1859b9..de3fc087d 100644 --- a/stdlib/source/lux/abstract/predicate.lux +++ b/stdlib/source/lux/abstract/predicate.lux @@ -1,6 +1,7 @@ (.module: [lux #* - ["." function]] + [control + ["." function]]] [// [monoid (#+ Monoid)] [functor (#+ Contravariant)]]) @@ -10,7 +11,7 @@ (template [ ] [(def: #export - (All [a] (Predicate a)) + Predicate (function.constant )) (def: #export ( left right) @@ -19,8 +20,8 @@ ( (left value) (right value))))] - [none #0 union or] - [all #1 intersection and] + [none #0 unite or] + [all #1 intersect and] ) (template [ ] @@ -30,8 +31,8 @@ (def: identity ) (def: compose ))] - [Union@Monoid none union] - [Intersection@Monoid all intersection] + [union ..none ..unite] + [intersection ..all ..intersect] ) (def: #export (complement predicate) @@ -50,7 +51,7 @@ (Predicate a))) (|>> (predicate (rec predicate)))) -(structure: #export _ +(structure: #export contravariant (Contravariant Predicate) (def: (map-1 f fb) diff --git a/stdlib/source/lux/cli.lux b/stdlib/source/lux/cli.lux deleted file mode 100644 index 2ee55a9b5..000000000 --- a/stdlib/source/lux/cli.lux +++ /dev/null @@ -1,176 +0,0 @@ -(.module: - [lux #* - [abstract - [monad (#+ do)]] - [control - ["p" parser (#+ Parser)] - [concurrency - ["." process]]] - [data - [collection - ["." list ("#@." monoid monad)]] - ["." text ("#@." equivalence) - format] - ["." error (#+ Error)]] - [macro (#+ with-gensyms) - ["." code] - ["s" syntax (#+ Syntax syntax:)]] - [tool - [compiler - ["." host]]] - ["." io]]) - -(type: #export (CLI a) - {#.doc "A command-line interface parser."} - (Parser (List Text) a)) - -(def: #export (run inputs parser) - (All [a] (-> (List Text) (CLI a) (Error a))) - (case (p.run inputs parser) - (#error.Success [remaining output]) - (case remaining - #.Nil - (#error.Success output) - - _ - (#error.Failure (format "Remaining CLI inputs: " (text.join-with " " remaining)))) - - (#error.Failure error) - (#error.Failure error))) - -(def: #export any - {#.doc "Just returns the next input without applying any logic."} - (CLI Text) - (function (_ inputs) - (case inputs - (#.Cons arg inputs') - (#error.Success [inputs' arg]) - - _ - (#error.Failure "Cannot parse empty arguments.")))) - -(def: #export (parse parser) - {#.doc "Parses the next input with a parsing function."} - (All [a] (-> (-> Text (Error a)) (CLI a))) - (function (_ inputs) - (do error.monad - [[remaining raw] (any inputs) - output (parser raw)] - (wrap [remaining output])))) - -(def: #export (this reference) - {#.doc "Checks that a token is in the inputs."} - (-> Text (CLI Any)) - (function (_ inputs) - (do error.monad - [[remaining raw] (any inputs)] - (if (text@= reference raw) - (wrap [remaining []]) - (error.fail (format "Missing token: '" reference "'")))))) - -(def: #export (somewhere cli) - {#.doc "Given a parser, tries to parse it somewhere in the inputs (i.e. not necessarily parsing the immediate inputs)."} - (All [a] (-> (CLI a) (CLI a))) - (function (_ inputs) - (loop [immediate inputs] - (case (p.run immediate cli) - (#error.Success [remaining output]) - (#error.Success [remaining output]) - - (#error.Failure error) - (case immediate - #.Nil - (#error.Failure error) - - (#.Cons to-omit immediate') - (do error.monad - [[remaining output] (recur immediate')] - (wrap [(#.Cons to-omit remaining) - output]))))))) - -(def: #export end - {#.doc "Ensures there are no more inputs."} - (CLI Any) - (function (_ inputs) - (case inputs - #.Nil (#error.Success [inputs []]) - _ (#error.Failure (format "Unknown parameters: " (text.join-with " " inputs)))))) - -(def: #export (named name value) - (All [a] (-> Text (CLI a) (CLI a))) - (|> value - (p.after (..this name)) - ..somewhere)) - -(def: #export (parameter [short long] value) - (All [a] (-> [Text Text] (CLI a) (CLI a))) - (|> value - (p.after (p.either (..this short) (..this long))) - ..somewhere)) - -(type: Program-Args - (#Raw Text) - (#Parsed (List [Code Code]))) - -(def: program-args^ - (Syntax Program-Args) - (p.or s.local-identifier - (s.tuple (p.some (p.either (do p.monad - [name s.local-identifier] - (wrap [(code.identifier ["" name]) (` any)])) - (s.record (p.and s.any s.any))))))) - -(syntax: #export (program: - {args program-args^} - body) - {#.doc (doc "Defines the entry-point to a program (similar to the 'main' function/method in other programming languages)." - "Can take a list of all the input parameters to the program, or can destructure them using CLI-option combinators from the lux/cli module." - (program: all-args - (do io.monad - [foo init-program - bar (do-something all-args)] - (wrap []))) - - (program: [name] - (io (log! (text@compose "Hello, " name)))) - - (program: [{config config^}] - (do io.monad - [data (init-program config)] - (do-something data))))} - (with-gensyms [g!program] - (case args - (#Raw args) - (wrap (list (` ("lux def program" - (.function ((~ g!program) (~ (code.identifier ["" args]))) - ((~! do) (~! io.monad) - [] - (~ body))))))) - - (#Parsed args) - (with-gensyms [g!args g!_ g!output g!message] - (wrap (list (` ("lux def program" - (.function ((~ g!program) (~ g!args)) - (case ((: (~! (..CLI (io.IO .Any))) - ((~! do) (~! p.monad) - [(~+ (|> args - (list@map (function (_ [binding parser]) - (list binding parser))) - list@join)) - (~ g!_) ..end] - ((~' wrap) ((~! do) (~! io.monad) - [(~ g!output) (~ body) - (~+ (`` (for {(~~ (static host.jvm)) - (list)} - (list g!_ - (` process.run!)))))] - ((~' wrap) (~ g!output)))))) - (~ g!args)) - (#error.Success [(~ g!_) (~ g!output)]) - (~ g!output) - - (#error.Failure (~ g!message)) - (.error! (~ g!message)) - )))) - ))) - ))) diff --git a/stdlib/source/lux/control/cli.lux b/stdlib/source/lux/control/cli.lux new file mode 100644 index 000000000..f8201ce87 --- /dev/null +++ b/stdlib/source/lux/control/cli.lux @@ -0,0 +1,176 @@ +(.module: + [lux #* + [abstract + [monad (#+ do)]] + [data + [collection + ["." list ("#@." monoid monad)]] + ["." text ("#@." equivalence) + format] + ["." error (#+ Error)]] + [macro (#+ with-gensyms) + ["." code] + ["s" syntax (#+ Syntax syntax:)]] + [tool + [compiler + ["." host]]]] + [// + ["." io] + ["p" parser (#+ Parser)] + [concurrency + ["." process]]]) + +(type: #export (CLI a) + {#.doc "A command-line interface parser."} + (Parser (List Text) a)) + +(def: #export (run inputs parser) + (All [a] (-> (List Text) (CLI a) (Error a))) + (case (p.run inputs parser) + (#error.Success [remaining output]) + (case remaining + #.Nil + (#error.Success output) + + _ + (#error.Failure (format "Remaining CLI inputs: " (text.join-with " " remaining)))) + + (#error.Failure error) + (#error.Failure error))) + +(def: #export any + {#.doc "Just returns the next input without applying any logic."} + (CLI Text) + (function (_ inputs) + (case inputs + (#.Cons arg inputs') + (#error.Success [inputs' arg]) + + _ + (#error.Failure "Cannot parse empty arguments.")))) + +(def: #export (parse parser) + {#.doc "Parses the next input with a parsing function."} + (All [a] (-> (-> Text (Error a)) (CLI a))) + (function (_ inputs) + (do error.monad + [[remaining raw] (any inputs) + output (parser raw)] + (wrap [remaining output])))) + +(def: #export (this reference) + {#.doc "Checks that a token is in the inputs."} + (-> Text (CLI Any)) + (function (_ inputs) + (do error.monad + [[remaining raw] (any inputs)] + (if (text@= reference raw) + (wrap [remaining []]) + (error.fail (format "Missing token: '" reference "'")))))) + +(def: #export (somewhere cli) + {#.doc "Given a parser, tries to parse it somewhere in the inputs (i.e. not necessarily parsing the immediate inputs)."} + (All [a] (-> (CLI a) (CLI a))) + (function (_ inputs) + (loop [immediate inputs] + (case (p.run immediate cli) + (#error.Success [remaining output]) + (#error.Success [remaining output]) + + (#error.Failure error) + (case immediate + #.Nil + (#error.Failure error) + + (#.Cons to-omit immediate') + (do error.monad + [[remaining output] (recur immediate')] + (wrap [(#.Cons to-omit remaining) + output]))))))) + +(def: #export end + {#.doc "Ensures there are no more inputs."} + (CLI Any) + (function (_ inputs) + (case inputs + #.Nil (#error.Success [inputs []]) + _ (#error.Failure (format "Unknown parameters: " (text.join-with " " inputs)))))) + +(def: #export (named name value) + (All [a] (-> Text (CLI a) (CLI a))) + (|> value + (p.after (..this name)) + ..somewhere)) + +(def: #export (parameter [short long] value) + (All [a] (-> [Text Text] (CLI a) (CLI a))) + (|> value + (p.after (p.either (..this short) (..this long))) + ..somewhere)) + +(type: Program-Args + (#Raw Text) + (#Parsed (List [Code Code]))) + +(def: program-args^ + (Syntax Program-Args) + (p.or s.local-identifier + (s.tuple (p.some (p.either (do p.monad + [name s.local-identifier] + (wrap [(code.identifier ["" name]) (` any)])) + (s.record (p.and s.any s.any))))))) + +(syntax: #export (program: + {args program-args^} + body) + {#.doc (doc "Defines the entry-point to a program (similar to the 'main' function/method in other programming languages)." + "Can take a list of all the input parameters to the program, or can destructure them using CLI-option combinators from the lux/cli module." + (program: all-args + (do io.monad + [foo init-program + bar (do-something all-args)] + (wrap []))) + + (program: [name] + (io (log! (text@compose "Hello, " name)))) + + (program: [{config config^}] + (do io.monad + [data (init-program config)] + (do-something data))))} + (with-gensyms [g!program] + (case args + (#Raw args) + (wrap (list (` ("lux def program" + (.function ((~ g!program) (~ (code.identifier ["" args]))) + ((~! do) (~! io.monad) + [] + (~ body))))))) + + (#Parsed args) + (with-gensyms [g!args g!_ g!output g!message] + (wrap (list (` ("lux def program" + (.function ((~ g!program) (~ g!args)) + (case ((: (~! (..CLI (io.IO .Any))) + ((~! do) (~! p.monad) + [(~+ (|> args + (list@map (function (_ [binding parser]) + (list binding parser))) + list@join)) + (~ g!_) ..end] + ((~' wrap) ((~! do) (~! io.monad) + [(~ g!output) (~ body) + (~+ (`` (for {(~~ (static host.jvm)) + (list)} + (list g!_ + (` process.run!)))))] + ((~' wrap) (~ g!output)))))) + (~ g!args)) + (#error.Success [(~ g!_) (~ g!output)]) + (~ g!output) + + (#error.Failure (~ g!message)) + (.error! (~ g!message)) + )))) + ))) + ))) diff --git a/stdlib/source/lux/control/concurrency/actor.lux b/stdlib/source/lux/control/concurrency/actor.lux index 3384b7b66..97aa88b5c 100644 --- a/stdlib/source/lux/control/concurrency/actor.lux +++ b/stdlib/source/lux/control/concurrency/actor.lux @@ -1,12 +1,12 @@ (.module: {#.doc "The actor model of concurrency."} [lux #* - ["." function] [abstract monad] [control + ["." function] ["p" parser] - ["ex" exception (#+ exception:)]] - ["." io (#+ IO io) ("#;." monad)] + ["ex" exception (#+ exception:)] + ["." io (#+ IO io) ("#;." monad)]] [data ["." product] ["." error (#+ Error)] diff --git a/stdlib/source/lux/control/concurrency/atom.lux b/stdlib/source/lux/control/concurrency/atom.lux index 6b88a0a4a..6ef8c8466 100644 --- a/stdlib/source/lux/control/concurrency/atom.lux +++ b/stdlib/source/lux/control/concurrency/atom.lux @@ -2,8 +2,9 @@ [lux #* [abstract [monad (#+ do)]] - ["." function] - ["." io (#- run)] + [control + ["." function] + ["." io (#- run)]] [type abstract] [tool diff --git a/stdlib/source/lux/control/concurrency/frp.lux b/stdlib/source/lux/control/concurrency/frp.lux index 74212594f..ac145f78a 100644 --- a/stdlib/source/lux/control/concurrency/frp.lux +++ b/stdlib/source/lux/control/concurrency/frp.lux @@ -1,6 +1,5 @@ (.module: [lux #* - ["." io (#+ IO io)] [abstract [predicate (#+ Predicate)] [equivalence (#+ Equivalence)] @@ -8,7 +7,8 @@ [apply (#+ Apply)] ["." monad (#+ Monad do)]] [control - ["ex" exception (#+ exception:)]] + ["ex" exception (#+ exception:)] + ["." io (#+ IO io)]] [data ["." maybe ("#@." functor)] ["." error (#+ Error)] diff --git a/stdlib/source/lux/control/concurrency/process.lux b/stdlib/source/lux/control/concurrency/process.lux index 96963a7f2..c7f9ae82e 100644 --- a/stdlib/source/lux/control/concurrency/process.lux +++ b/stdlib/source/lux/control/concurrency/process.lux @@ -3,14 +3,14 @@ [abstract ["." monad (#+ do)]] [control - ["ex" exception (#+ exception:)]] + ["ex" exception (#+ exception:)] + ["." io (#+ IO io)]] [data [collection ["." list]]] [tool [compiler ["." host]]] - ["." io (#+ IO io)] [host (#+ import: object)]] [// ["." atom (#+ Atom)]]) diff --git a/stdlib/source/lux/control/concurrency/promise.lux b/stdlib/source/lux/control/concurrency/promise.lux index 63f506c37..49d4247b4 100644 --- a/stdlib/source/lux/control/concurrency/promise.lux +++ b/stdlib/source/lux/control/concurrency/promise.lux @@ -4,12 +4,13 @@ [functor (#+ Functor)] [apply (#+ Apply)] ["." monad (#+ Monad do)]] + [control + ["." function] + ["." io (#+ IO io)]] [data ["." product]] - ["." function] [type - abstract] - ["." io (#+ IO io)]] + abstract]] [// ["." process] ["." atom (#+ Atom atom)]]) diff --git a/stdlib/source/lux/control/concurrency/semaphore.lux b/stdlib/source/lux/control/concurrency/semaphore.lux index 1159e41e6..fab5d4498 100644 --- a/stdlib/source/lux/control/concurrency/semaphore.lux +++ b/stdlib/source/lux/control/concurrency/semaphore.lux @@ -2,7 +2,8 @@ [lux #* [abstract [monad (#+ do)]] - ["." io (#+ IO)] + [control + ["." io (#+ IO)]] [type abstract ["." refinement]]] diff --git a/stdlib/source/lux/control/concurrency/stm.lux b/stdlib/source/lux/control/concurrency/stm.lux index fce9cbd82..9d97b389f 100644 --- a/stdlib/source/lux/control/concurrency/stm.lux +++ b/stdlib/source/lux/control/concurrency/stm.lux @@ -4,7 +4,8 @@ [functor (#+ Functor)] [apply (#+ Apply)] ["." monad (#+ do Monad)]] - ["." io (#+ IO io)] + [control + ["." io (#+ IO io)]] [data ["." product] ["." maybe] diff --git a/stdlib/source/lux/control/continuation.lux b/stdlib/source/lux/control/continuation.lux index e960e1fd3..591966b89 100644 --- a/stdlib/source/lux/control/continuation.lux +++ b/stdlib/source/lux/control/continuation.lux @@ -4,7 +4,8 @@ [functor (#+ Functor)] [apply (#+ Apply)] [monad (#+ Monad do)]] - ["." function] + [control + ["." function]] [macro (#+ with-gensyms) ["." code] ["s" syntax (#+ syntax:)]]]) diff --git a/stdlib/source/lux/control/function.lux b/stdlib/source/lux/control/function.lux new file mode 100644 index 000000000..5a33a2aae --- /dev/null +++ b/stdlib/source/lux/control/function.lux @@ -0,0 +1,40 @@ +(.module: + [lux #* + [abstract + [monoid (#+ Monoid)]]]) + +(def: #export identity + {#.doc (doc "Identity function." + "Does nothing to it's argument and just returns it." + (let [value "foo"] + (is? (identity value) + value)))} + (All [a] (-> a a)) + (|>>)) + +(def: #export (compose f g) + {#.doc (doc "Function composition." + (= ((compose f g) "foo") + (f (g "foo"))))} + (All [a b c] + (-> (-> b c) (-> a b) (-> a c))) + (|>> g f)) + +(def: #export (constant value) + {#.doc (doc "Create constant functions." + (= ((constant "foo") "bar") + "foo"))} + (All [o] (-> o (All [i] (-> i o)))) + (function (_ _) value)) + +(def: #export (flip f) + {#.doc (doc "Flips the order of the arguments of a function." + (= ((flip f) "foo" "bar") + (f "bar" "foo")))} + (All [a b c] + (-> (-> a b c) (-> b a c))) + (function (_ x y) (f y x))) + +(structure: #export monoid (All [a] (Monoid (-> a a))) + (def: identity ..identity) + (def: compose ..compose)) diff --git a/stdlib/source/lux/control/io.lux b/stdlib/source/lux/control/io.lux new file mode 100644 index 000000000..4102ff9c4 --- /dev/null +++ b/stdlib/source/lux/control/io.lux @@ -0,0 +1,65 @@ +(.module: {#.doc "A method for abstracting I/O and effectful computations to make it safe while writing pure functional code."} + [lux #* + [abstract + [functor (#+ Functor)] + [apply (#+ Apply)] + [monad (#+ Monad do)]] + [type + abstract] + ["." macro (#+ with-gensyms) + ["s" syntax (#+ syntax:)] + ["." template]]]) + +(abstract: #export (IO a) + {#.doc "A type that represents synchronous, effectful computations that may interact with the outside world."} + (-> Nothing a) + + (def: #export (label thunk) + (All [a] (-> (-> Nothing a) (IO a))) + (:abstraction thunk)) + + (template: (!io computation) + (:abstraction (template.with-locals [g!func g!arg] + (function (g!func g!arg) + computation)))) + + (template: (!execute io) + ## creatio ex nihilo + ((:representation io) (:coerce .Nothing []))) + + (syntax: #export (io computation) + {#.doc (doc "Delays the evaluation of an expression, by wrapping it in an IO 'thunk'." + "Great for wrapping effectful computations (which will not be performed until the IO is 'run')." + (io (exec + (log! msg) + "Some value...")))} + (with-gensyms [g!func g!arg] + (wrap (list (` ((~! ..label) (function ((~ g!func) (~ g!arg)) + (~ computation)))))))) + + (def: #export (exit code) + (-> Int (IO Nothing)) + (!io ("lux io exit" code))) + + (def: #export run + {#.doc "A way to execute IO computations and perform their side-effects."} + (All [a] (-> (IO a) a)) + (|>> !execute)) + + (structure: #export functor (Functor IO) + (def: (map f) + (|>> !execute f !io))) + + (structure: #export apply (Apply IO) + (def: &functor ..functor) + + (def: (apply ff fa) + (!io ((!execute ff) (!execute fa))))) + + (structure: #export monad (Monad IO) + (def: &functor ..functor) + + (def: wrap (|>> !io)) + + (def: join (|>> !execute !execute !io))) + ) diff --git a/stdlib/source/lux/control/security/capability.lux b/stdlib/source/lux/control/security/capability.lux index 4684c8bdf..48392c045 100644 --- a/stdlib/source/lux/control/security/capability.lux +++ b/stdlib/source/lux/control/security/capability.lux @@ -1,10 +1,10 @@ (.module: [lux #* - ["." io (#+ IO)] [abstract [monad (#+ do)]] [control ["p" parser] + ["." io (#+ IO)] [concurrency ["." promise (#+ Promise)]]] [data diff --git a/stdlib/source/lux/control/thread.lux b/stdlib/source/lux/control/thread.lux index e74dc1eb5..2edaeb8b4 100644 --- a/stdlib/source/lux/control/thread.lux +++ b/stdlib/source/lux/control/thread.lux @@ -4,6 +4,8 @@ [functor (#+ Functor)] [apply (#+ Apply)] [monad (#+ Monad do)]] + [control + ["." io (#+ IO)]] [data [collection ["." array (#+ Array)]]] @@ -11,8 +13,7 @@ abstract] [tool [compiler - ["." host]]] - ["." io (#+ IO)]]) + ["." host]]]]) (type: #export (Thread ! a) (-> ! a)) diff --git a/stdlib/source/lux/data/bit.lux b/stdlib/source/lux/data/bit.lux index 8c1b1d1b3..d80606137 100644 --- a/stdlib/source/lux/data/bit.lux +++ b/stdlib/source/lux/data/bit.lux @@ -5,7 +5,8 @@ [equivalence (#+ Equivalence)] hash [codec (#+ Codec)]] - ["." function]]) + [control + ["." function]]]) (structure: #export equivalence (Equivalence Bit) diff --git a/stdlib/source/lux/data/identity.lux b/stdlib/source/lux/data/identity.lux index ff464a6f8..412103987 100644 --- a/stdlib/source/lux/data/identity.lux +++ b/stdlib/source/lux/data/identity.lux @@ -5,7 +5,8 @@ [apply (#+ Apply)] [monad (#+ Monad)] [comonad (#+ CoMonad)]] - ["." function]]) + [control + ["." function]]]) (type: #export (Identity a) a) diff --git a/stdlib/source/lux/data/lazy.lux b/stdlib/source/lux/data/lazy.lux index 82cd8ec51..34bdf494f 100644 --- a/stdlib/source/lux/data/lazy.lux +++ b/stdlib/source/lux/data/lazy.lux @@ -1,12 +1,12 @@ (.module: [lux #* - ["." io] [abstract [functor (#+ Functor)] [apply (#+ Apply)] [monad (#+ Monad do)] [equivalence (#+ Equivalence)]] [control + ["." io] [concurrency ["." atom]]] [macro (#+ with-gensyms) diff --git a/stdlib/source/lux/data/number/nat.lux b/stdlib/source/lux/data/number/nat.lux index 5ca294df5..f5258db23 100644 --- a/stdlib/source/lux/data/number/nat.lux +++ b/stdlib/source/lux/data/number/nat.lux @@ -9,11 +9,12 @@ [equivalence (#+ Equivalence)] [codec (#+ Codec)] ["." order (#+ Order)]] + [control + ["." function]] [data ["." error (#+ Error)] ["." maybe] - ["." text (#+ Char)]] - ["." function]]) + ["." text (#+ Char)]]]) (structure: #export equivalence (Equivalence Nat) (def: = n/=)) diff --git a/stdlib/source/lux/data/number/ratio.lux b/stdlib/source/lux/data/number/ratio.lux index a501f9a1b..7542a56ff 100644 --- a/stdlib/source/lux/data/number/ratio.lux +++ b/stdlib/source/lux/data/number/ratio.lux @@ -8,6 +8,7 @@ [codec (#+ Codec)] [monad (#+ do)]] [control + ["." function] ["p" parser]] [data ["." error] @@ -16,7 +17,6 @@ [number ["." nat ("#@." decimal)]] ["." text ("#@." monoid)]] - ["." function] ["." math] ["." macro ["." code] diff --git a/stdlib/source/lux/data/number/rev.lux b/stdlib/source/lux/data/number/rev.lux index 4738a72a0..3dbfeb6fc 100644 --- a/stdlib/source/lux/data/number/rev.lux +++ b/stdlib/source/lux/data/number/rev.lux @@ -9,12 +9,13 @@ [equivalence (#+ Equivalence)] ["." order (#+ Order)] [codec (#+ Codec)]] + [control + ["." function]] [data ["." error (#+ Error)] ["." maybe] [collection - ["." array (#+ Array)]]] - ["." function]] + ["." array (#+ Array)]]]] ["." // #_ ["#." i64] ["#." nat] diff --git a/stdlib/source/lux/function.lux b/stdlib/source/lux/function.lux deleted file mode 100644 index 5a33a2aae..000000000 --- a/stdlib/source/lux/function.lux +++ /dev/null @@ -1,40 +0,0 @@ -(.module: - [lux #* - [abstract - [monoid (#+ Monoid)]]]) - -(def: #export identity - {#.doc (doc "Identity function." - "Does nothing to it's argument and just returns it." - (let [value "foo"] - (is? (identity value) - value)))} - (All [a] (-> a a)) - (|>>)) - -(def: #export (compose f g) - {#.doc (doc "Function composition." - (= ((compose f g) "foo") - (f (g "foo"))))} - (All [a b c] - (-> (-> b c) (-> a b) (-> a c))) - (|>> g f)) - -(def: #export (constant value) - {#.doc (doc "Create constant functions." - (= ((constant "foo") "bar") - "foo"))} - (All [o] (-> o (All [i] (-> i o)))) - (function (_ _) value)) - -(def: #export (flip f) - {#.doc (doc "Flips the order of the arguments of a function." - (= ((flip f) "foo" "bar") - (f "bar" "foo")))} - (All [a b c] - (-> (-> a b c) (-> b a c))) - (function (_ x y) (f y x))) - -(structure: #export monoid (All [a] (Monoid (-> a a))) - (def: identity ..identity) - (def: compose ..compose)) diff --git a/stdlib/source/lux/host.jvm.lux b/stdlib/source/lux/host.jvm.lux index b829e21c9..915cdc7bf 100644 --- a/stdlib/source/lux/host.jvm.lux +++ b/stdlib/source/lux/host.jvm.lux @@ -4,7 +4,9 @@ ["." monad (#+ Monad do)] ["." enum]] [control - ["p" parser]] + ["p" parser] + ["." function] + ["." io]] [data ["." maybe] ["." product] @@ -16,12 +18,10 @@ [collection ["." array (#+ Array)] ["." list ("#;." monad fold monoid)]]] - ["." function] ["." type ("#;." equivalence)] ["." macro (#+ with-gensyms) ["." code] - ["s" syntax (#+ syntax: Syntax)]] - ["." io]]) + ["s" syntax (#+ syntax: Syntax)]]]) (template [ ] [(def: #export ( value) diff --git a/stdlib/source/lux/host/jvm/loader.jvm.lux b/stdlib/source/lux/host/jvm/loader.jvm.lux index 22e8a8352..9227b6c69 100644 --- a/stdlib/source/lux/host/jvm/loader.jvm.lux +++ b/stdlib/source/lux/host/jvm/loader.jvm.lux @@ -4,6 +4,7 @@ [monad (#+ do)]] [control ["ex" exception (#+ exception:)] + ["." io (#+ IO)] [concurrency ["." atom (#+ Atom)]]] [data @@ -14,7 +15,6 @@ ["." array] ["." list ("#;." functor)] ["." dictionary (#+ Dictionary)]]] - ["." io (#+ IO)] [world ["." binary (#+ Binary)]] ["." host (#+ import: object do-to)]]) diff --git a/stdlib/source/lux/host/scheme.lux b/stdlib/source/lux/host/scheme.lux index af8e0b954..820ff8c83 100644 --- a/stdlib/source/lux/host/scheme.lux +++ b/stdlib/source/lux/host/scheme.lux @@ -1,8 +1,8 @@ (.module: [lux (#- Code int or and if function cond let) - ["." function] [control - [pipe (#+ new> cond> case>)]] + [pipe (#+ new> cond> case>)] + ["." function]] [data [number ["." frac]] diff --git a/stdlib/source/lux/io.lux b/stdlib/source/lux/io.lux deleted file mode 100644 index 4102ff9c4..000000000 --- a/stdlib/source/lux/io.lux +++ /dev/null @@ -1,65 +0,0 @@ -(.module: {#.doc "A method for abstracting I/O and effectful computations to make it safe while writing pure functional code."} - [lux #* - [abstract - [functor (#+ Functor)] - [apply (#+ Apply)] - [monad (#+ Monad do)]] - [type - abstract] - ["." macro (#+ with-gensyms) - ["s" syntax (#+ syntax:)] - ["." template]]]) - -(abstract: #export (IO a) - {#.doc "A type that represents synchronous, effectful computations that may interact with the outside world."} - (-> Nothing a) - - (def: #export (label thunk) - (All [a] (-> (-> Nothing a) (IO a))) - (:abstraction thunk)) - - (template: (!io computation) - (:abstraction (template.with-locals [g!func g!arg] - (function (g!func g!arg) - computation)))) - - (template: (!execute io) - ## creatio ex nihilo - ((:representation io) (:coerce .Nothing []))) - - (syntax: #export (io computation) - {#.doc (doc "Delays the evaluation of an expression, by wrapping it in an IO 'thunk'." - "Great for wrapping effectful computations (which will not be performed until the IO is 'run')." - (io (exec - (log! msg) - "Some value...")))} - (with-gensyms [g!func g!arg] - (wrap (list (` ((~! ..label) (function ((~ g!func) (~ g!arg)) - (~ computation)))))))) - - (def: #export (exit code) - (-> Int (IO Nothing)) - (!io ("lux io exit" code))) - - (def: #export run - {#.doc "A way to execute IO computations and perform their side-effects."} - (All [a] (-> (IO a) a)) - (|>> !execute)) - - (structure: #export functor (Functor IO) - (def: (map f) - (|>> !execute f !io))) - - (structure: #export apply (Apply IO) - (def: &functor ..functor) - - (def: (apply ff fa) - (!io ((!execute ff) (!execute fa))))) - - (structure: #export monad (Monad IO) - (def: &functor ..functor) - - (def: wrap (|>> !io)) - - (def: join (|>> !execute !execute !io))) - ) diff --git a/stdlib/source/lux/macro/poly.lux b/stdlib/source/lux/macro/poly.lux index 31b293144..a3d78177a 100644 --- a/stdlib/source/lux/macro/poly.lux +++ b/stdlib/source/lux/macro/poly.lux @@ -5,8 +5,8 @@ [equivalence]] [control ["p" parser] - ["ex" exception (#+ exception:)]] - ["." function] + ["ex" exception (#+ exception:)] + ["." function]] [data ["." product] ["." bit] diff --git a/stdlib/source/lux/macro/syntax/common/writer.lux b/stdlib/source/lux/macro/syntax/common/writer.lux index 2110aa26e..bf675857d 100644 --- a/stdlib/source/lux/macro/syntax/common/writer.lux +++ b/stdlib/source/lux/macro/syntax/common/writer.lux @@ -1,11 +1,12 @@ (.module: {#.doc "Commons syntax writers."} [lux #* + [control + ["." function]] [data [collection ["." list ("#;." functor)]] ["." product]] - ["." function] [macro ["." code]]] ["." //]) diff --git a/stdlib/source/lux/test.lux b/stdlib/source/lux/test.lux index 58d7654d3..8bf74ff49 100644 --- a/stdlib/source/lux/test.lux +++ b/stdlib/source/lux/test.lux @@ -4,6 +4,7 @@ ["." monad (#+ Monad do)]] [control ["ex" exception (#+ exception:)] + ["." io] [concurrency ["." promise (#+ Promise) ("#;." monad)]]] [data @@ -16,8 +17,7 @@ ["." instant] ["." duration]] [math - ["r" random ("#;." monad)]] - ["." io]]) + ["r" random ("#;." monad)]]]) (type: #export Counters {#successes Nat diff --git a/stdlib/source/lux/time/instant.lux b/stdlib/source/lux/time/instant.lux index 866616ca1..06e11a664 100644 --- a/stdlib/source/lux/time/instant.lux +++ b/stdlib/source/lux/time/instant.lux @@ -1,6 +1,5 @@ (.module: [lux #* - [io (#+ IO io)] [abstract [equivalence (#+ Equivalence)] [order (#+ Order)] @@ -8,6 +7,7 @@ codec [monad (#+ do Monad)]] [control + [io (#+ IO io)] ["p" parser]] [data ["." error (#+ Error)] diff --git a/stdlib/source/lux/tool/compiler/analysis.lux b/stdlib/source/lux/tool/compiler/analysis.lux index 2f173007b..3abbc2ecc 100644 --- a/stdlib/source/lux/tool/compiler/analysis.lux +++ b/stdlib/source/lux/tool/compiler/analysis.lux @@ -2,6 +2,8 @@ [lux (#- nat int rev) [abstract [monad (#+ do)]] + [control + ["." function]] [data ["." product] ["." error] @@ -9,8 +11,7 @@ ["." text ("#;." equivalence) format] [collection - ["." list ("#;." functor fold)]]] - ["." function]] + ["." list ("#;." functor fold)]]]] [// ["." reference (#+ Register Variable Reference)] [phase diff --git a/stdlib/source/lux/tool/compiler/phase.lux b/stdlib/source/lux/tool/compiler/phase.lux index 09657c3cf..dbe13e40c 100644 --- a/stdlib/source/lux/tool/compiler/phase.lux +++ b/stdlib/source/lux/tool/compiler/phase.lux @@ -4,7 +4,8 @@ [monad (#+ do)]] [control ["." state] - ["ex" exception (#+ Exception exception:)]] + ["ex" exception (#+ Exception exception:)] + ["." io]] [data ["." product] ["." error (#+ Error) ("#;." functor)] @@ -13,7 +14,6 @@ [time ["." instant] ["." duration]] - ["." io] [macro ["s" syntax (#+ syntax:)]]]) diff --git a/stdlib/source/lux/tool/compiler/phase/extension.lux b/stdlib/source/lux/tool/compiler/phase/extension.lux index 87e7474d4..bce8a66d9 100644 --- a/stdlib/source/lux/tool/compiler/phase/extension.lux +++ b/stdlib/source/lux/tool/compiler/phase/extension.lux @@ -3,6 +3,7 @@ [abstract [monad (#+ do)]] [control + ["." function] ["ex" exception (#+ exception:)]] [data ["." error (#+ Error)] @@ -10,8 +11,7 @@ format] [collection ["." list ("#;." functor)] - ["." dictionary (#+ Dictionary)]]] - ["." function]] + ["." dictionary (#+ Dictionary)]]]] ["." //]) (type: #export Name Text) diff --git a/stdlib/source/lux/tool/compiler/phase/generation/js/runtime.lux b/stdlib/source/lux/tool/compiler/phase/generation/js/runtime.lux index 97eee0025..4fba47218 100644 --- a/stdlib/source/lux/tool/compiler/phase/generation/js/runtime.lux +++ b/stdlib/source/lux/tool/compiler/phase/generation/js/runtime.lux @@ -1,9 +1,9 @@ (.module: [lux #* - ["." function] [abstract [monad (#+ do)]] [control + ["." function] ["p" parser]] [data [number (#+ hex) diff --git a/stdlib/source/lux/tool/compiler/phase/generation/python/extension/common.lux b/stdlib/source/lux/tool/compiler/phase/generation/python/extension/common.lux index 46cd6d79e..adec09fa3 100644 --- a/stdlib/source/lux/tool/compiler/phase/generation/python/extension/common.lux +++ b/stdlib/source/lux/tool/compiler/phase/generation/python/extension/common.lux @@ -1,8 +1,9 @@ (.module: [lux #* - ["." function] [abstract ["." monad (#+ do)]] + [control + ["." function]] [data ["." product] [collection diff --git a/stdlib/source/lux/tool/compiler/phase/generation/python/runtime.lux b/stdlib/source/lux/tool/compiler/phase/generation/python/runtime.lux index d10434000..d095e9fe2 100644 --- a/stdlib/source/lux/tool/compiler/phase/generation/python/runtime.lux +++ b/stdlib/source/lux/tool/compiler/phase/generation/python/runtime.lux @@ -1,9 +1,9 @@ (.module: [lux (#- inc) - ["." function] [abstract [monad (#+ do)]] [control + ["." function] ["p" parser]] [data [number (#+ hex) diff --git a/stdlib/source/lux/tool/compiler/phase/generation/scheme/runtime.jvm.lux b/stdlib/source/lux/tool/compiler/phase/generation/scheme/runtime.jvm.lux index 1e891c006..b66b7abaf 100644 --- a/stdlib/source/lux/tool/compiler/phase/generation/scheme/runtime.jvm.lux +++ b/stdlib/source/lux/tool/compiler/phase/generation/scheme/runtime.jvm.lux @@ -1,9 +1,9 @@ (.module: [lux #* - ["." function] [abstract [monad (#+ do)]] [control + ["." function] ["p" parser ("#;." monad)]] [data [number (#+ hex)] diff --git a/stdlib/source/lux/type/resource.lux b/stdlib/source/lux/type/resource.lux index 22d83defd..8e4b63679 100644 --- a/stdlib/source/lux/type/resource.lux +++ b/stdlib/source/lux/type/resource.lux @@ -6,6 +6,7 @@ [control ["p" parser] ["ex" exception (#+ exception:)] + ["." io (#+ IO)] [concurrency ["." promise (#+ Promise)]]] [data @@ -23,8 +24,7 @@ ["." macro ["s" syntax (#+ Syntax syntax:)]] [type - abstract] - ["." io (#+ IO)]]) + abstract]]) (type: #export (Procedure monad input output value) (-> input (monad [output value]))) diff --git a/stdlib/source/lux/world/file.lux b/stdlib/source/lux/world/file.lux index c559c83e6..1e201d898 100644 --- a/stdlib/source/lux/world/file.lux +++ b/stdlib/source/lux/world/file.lux @@ -4,6 +4,7 @@ ["." monad (#+ Monad do)]] [control ["ex" exception (#+ Exception exception:)] + ["." io (#+ IO) ("#;." functor)] [concurrency ["." promise (#+ Promise)]] [security @@ -23,7 +24,6 @@ ["." template]] [world ["." binary (#+ Binary)]] - ["." io (#+ IO) ("#;." functor)] [host (#+ import:)] [tool [compiler diff --git a/stdlib/source/lux/world/net/tcp.jvm.lux b/stdlib/source/lux/world/net/tcp.jvm.lux index f9c72bff3..0b1d725e5 100644 --- a/stdlib/source/lux/world/net/tcp.jvm.lux +++ b/stdlib/source/lux/world/net/tcp.jvm.lux @@ -3,6 +3,7 @@ [abstract monad] [control + ["." io (#+ IO)] [concurrency ["." promise (#+ Promise Resolver)] ["." frp (#+ Channel Sink)]] @@ -12,7 +13,6 @@ ["." error (#+ Error)]] [world ["." binary (#+ Binary)]] - ["." io (#+ IO)] [host (#+ import:)] [tool [compiler diff --git a/stdlib/source/lux/world/net/udp.jvm.lux b/stdlib/source/lux/world/net/udp.jvm.lux index 505871b56..497ed6893 100644 --- a/stdlib/source/lux/world/net/udp.jvm.lux +++ b/stdlib/source/lux/world/net/udp.jvm.lux @@ -4,6 +4,7 @@ monad] [control ["ex" exception (#+ exception:)] + ["." io (#+ IO)] [concurrency ["." promise (#+ Promise)]] [security @@ -15,7 +16,6 @@ ["." array]]] [world ["." binary (#+ Binary)]] - ["." io (#+ IO)] [host (#+ import:)] [tool [compiler diff --git a/stdlib/source/test/lux.lux b/stdlib/source/test/lux.lux index 5b45d6e5e..42f4c9f81 100644 --- a/stdlib/source/test/lux.lux +++ b/stdlib/source/test/lux.lux @@ -10,15 +10,16 @@ [host (#+)]])] (.module: ["/" lux #* - [cli (#+ program:)] - ["." io (#+ io)] [abstract [monad (#+ do)] [predicate (#+ Predicate)]] + [control + [cli (#+ program:)] + ["." io (#+ io)] + ["." function]] [data [number ["." i64]]] - ["." function] ["." math] ["_" test (#+ Test)] ## These modules do not need to be tested. @@ -110,8 +111,6 @@ ] ## TODO: Must have 100% coverage on tests. ["." / #_ - ["#." cli] - ["#." io] ["#." abstract] ["#." control] ["#." data] @@ -353,8 +352,6 @@ ..templates) (<| (_.context "Cross-platform support.") ..cross-platform-support) - /cli.test - /io.test (<| (_.context "/abstract") /abstract.test) (<| (_.context "/control") @@ -362,16 +359,15 @@ (<| (_.context "/data") /data.test) /macro.test - (<| (_.context "/math") - /math.test) + /math.test (<| (_.context "/time") /time.test) /type.test /world.test - (<| (_.context "/host Host-platform interoperation") + (<| (_.context "/host") ($_ _.and /host.test - (<| (_.context "/jvm JVM (Java Virtual Machine)") + (<| (_.context "/jvm") /host/jvm.test))) ))) diff --git a/stdlib/source/test/lux/abstract/apply.lux b/stdlib/source/test/lux/abstract/apply.lux index a269810bb..6b3ea631f 100644 --- a/stdlib/source/test/lux/abstract/apply.lux +++ b/stdlib/source/test/lux/abstract/apply.lux @@ -4,7 +4,8 @@ [data [text format]] - ["." function] + [control + ["." function]] [math ["r" random]] ["_" test (#+ Test)]] diff --git a/stdlib/source/test/lux/abstract/enum.lux b/stdlib/source/test/lux/abstract/enum.lux index 63bbf97ad..b0498dc09 100644 --- a/stdlib/source/test/lux/abstract/enum.lux +++ b/stdlib/source/test/lux/abstract/enum.lux @@ -2,7 +2,8 @@ [lux #* data/text/format ["_" test (#+ Test)] - ["." function] + [control + ["." function]] [abstract/monad (#+ do)] [math ["r" random (#+ Random)]]] diff --git a/stdlib/source/test/lux/abstract/functor.lux b/stdlib/source/test/lux/abstract/functor.lux index cf3538575..77a07233b 100644 --- a/stdlib/source/test/lux/abstract/functor.lux +++ b/stdlib/source/test/lux/abstract/functor.lux @@ -6,7 +6,8 @@ [abstract [equivalence (#+ Equivalence)] [monad (#+ do)]] - ["." function]] + [control + ["." function]]] {1 ["." / (#+ Functor)]}) diff --git a/stdlib/source/test/lux/abstract/monad.lux b/stdlib/source/test/lux/abstract/monad.lux index 4382a260d..827a1e509 100644 --- a/stdlib/source/test/lux/abstract/monad.lux +++ b/stdlib/source/test/lux/abstract/monad.lux @@ -3,7 +3,8 @@ [data [text format]] - ["." function] + [control + ["." function]] [math ["r" random]] ["_" test (#+ Test)]] diff --git a/stdlib/source/test/lux/abstract/monoid.lux b/stdlib/source/test/lux/abstract/monoid.lux index b526c3e58..3600795ff 100644 --- a/stdlib/source/test/lux/abstract/monoid.lux +++ b/stdlib/source/test/lux/abstract/monoid.lux @@ -2,10 +2,11 @@ [lux #* data/text/format ["_" test (#+ Test)] - ["." function] [abstract/monad (#+ do)] [math - ["r" random (#+ Random)]]] + ["r" random (#+ Random)]] + [control + ["." function]]] {1 ["." / (#+ Monoid) [// diff --git a/stdlib/source/test/lux/cli.lux b/stdlib/source/test/lux/cli.lux deleted file mode 100644 index ff7a3abb3..000000000 --- a/stdlib/source/test/lux/cli.lux +++ /dev/null @@ -1,75 +0,0 @@ -(.module: - [lux #* - data/text/format - ["M" abstract/monad (#+ Monad do)] - ["_" test (#+ Test)] - ["r" math/random] - [control - pipe - ["p" parser]] - [data - ["." error] - [number - ["." nat ("#;." decimal)]] - ["." text ("#;." equivalence)] - [collection - ["." list]]]] - {1 - ["." /]}) - -(def: #export test - Test - (<| (_.context (%name (name-of /.CLI))) - (do r.monad - [num-args (|> r.nat (:: @ map (n/% 10))) - #let [gen-arg (:: @ map nat;encode r.nat)] - yes gen-arg - #let [gen-ignore (r.filter (|>> (text;= yes) not) - (r.unicode 5))] - no gen-ignore - pre-ignore (r.list 5 gen-ignore) - post-ignore (r.list 5 gen-ignore)] - ($_ _.and - (_.test "Can read any argument." - (|> (/.run (list yes) /.any) - (case> (#error.Failure _) - #0 - - (#error.Success arg) - (text;= arg yes)))) - (_.test "Can test tokens." - (and (|> (/.run (list yes) (/.this yes)) - (case> (#error.Failure _) - #0 - - (#error.Success _) - #1)) - (|> (/.run (list no) (/.this yes)) - (case> (#error.Failure _) - #1 - - (#error.Success _) - #0)))) - (_.test "Can use custom token parsers." - (|> (/.run (list yes) (/.parse nat;decode)) - (case> (#error.Failure _) - #0 - - (#error.Success parsed) - (text;= (nat;encode parsed) - yes)))) - (_.test "Can query if there are any more inputs." - (and (|> (/.run (list) /.end) - (case> (#error.Success []) #1 _ #0)) - (|> (/.run (list yes) (p.not /.end)) - (case> (#error.Success []) #0 _ #1)))) - (_.test "Can parse CLI input anywhere." - (|> (/.run (list.concat (list pre-ignore (list yes) post-ignore)) - (|> (/.somewhere (/.this yes)) - (p.before (p.some /.any)))) - (case> (#error.Failure _) - #0 - - (#error.Success _) - #1))) - )))) diff --git a/stdlib/source/test/lux/control.lux b/stdlib/source/test/lux/control.lux index 341a119fe..9d95dc969 100644 --- a/stdlib/source/test/lux/control.lux +++ b/stdlib/source/test/lux/control.lux @@ -2,8 +2,10 @@ [lux #* ["_" test (#+ Test)]] ["." / #_ + ["#." cli] ["#." continuation] ["#." exception] + ["#." io] ["#." parser] ["#." pipe] ["#." reader] @@ -19,7 +21,8 @@ ["#." stm]] [security ["#." privacy] - ["#." integrity]]]) + ["#." integrity]] + ]) (def: concurrency Test @@ -41,8 +44,10 @@ (def: #export test Test ($_ _.and + /cli.test /continuation.test /exception.test + /io.test /parser.test (<| (_.context "/pipe") /pipe.test) diff --git a/stdlib/source/test/lux/control/cli.lux b/stdlib/source/test/lux/control/cli.lux new file mode 100644 index 000000000..ff7a3abb3 --- /dev/null +++ b/stdlib/source/test/lux/control/cli.lux @@ -0,0 +1,75 @@ +(.module: + [lux #* + data/text/format + ["M" abstract/monad (#+ Monad do)] + ["_" test (#+ Test)] + ["r" math/random] + [control + pipe + ["p" parser]] + [data + ["." error] + [number + ["." nat ("#;." decimal)]] + ["." text ("#;." equivalence)] + [collection + ["." list]]]] + {1 + ["." /]}) + +(def: #export test + Test + (<| (_.context (%name (name-of /.CLI))) + (do r.monad + [num-args (|> r.nat (:: @ map (n/% 10))) + #let [gen-arg (:: @ map nat;encode r.nat)] + yes gen-arg + #let [gen-ignore (r.filter (|>> (text;= yes) not) + (r.unicode 5))] + no gen-ignore + pre-ignore (r.list 5 gen-ignore) + post-ignore (r.list 5 gen-ignore)] + ($_ _.and + (_.test "Can read any argument." + (|> (/.run (list yes) /.any) + (case> (#error.Failure _) + #0 + + (#error.Success arg) + (text;= arg yes)))) + (_.test "Can test tokens." + (and (|> (/.run (list yes) (/.this yes)) + (case> (#error.Failure _) + #0 + + (#error.Success _) + #1)) + (|> (/.run (list no) (/.this yes)) + (case> (#error.Failure _) + #1 + + (#error.Success _) + #0)))) + (_.test "Can use custom token parsers." + (|> (/.run (list yes) (/.parse nat;decode)) + (case> (#error.Failure _) + #0 + + (#error.Success parsed) + (text;= (nat;encode parsed) + yes)))) + (_.test "Can query if there are any more inputs." + (and (|> (/.run (list) /.end) + (case> (#error.Success []) #1 _ #0)) + (|> (/.run (list yes) (p.not /.end)) + (case> (#error.Success []) #0 _ #1)))) + (_.test "Can parse CLI input anywhere." + (|> (/.run (list.concat (list pre-ignore (list yes) post-ignore)) + (|> (/.somewhere (/.this yes)) + (p.before (p.some /.any)))) + (case> (#error.Failure _) + #0 + + (#error.Success _) + #1))) + )))) diff --git a/stdlib/source/test/lux/control/concurrency/actor.lux b/stdlib/source/test/lux/control/concurrency/actor.lux index eff4d051d..a39f7b039 100644 --- a/stdlib/source/test/lux/control/concurrency/actor.lux +++ b/stdlib/source/test/lux/control/concurrency/actor.lux @@ -1,12 +1,10 @@ (.module: [lux #* ["_" test (#+ Test)] - ["." io (#+ IO io)] [abstract/monad (#+ do)] [control ["ex" exception] - [concurrency - ["." promise ("#;." monad)]]] + ["." io (#+ IO io)]] [data ["." error] [text @@ -14,7 +12,9 @@ [math ["r" random]]] {1 - ["." / (#+ actor: message:)]}) + ["." / (#+ actor: message:) + [// + ["." promise ("#;." monad)]]]}) (actor: Counter Nat diff --git a/stdlib/source/test/lux/control/concurrency/atom.lux b/stdlib/source/test/lux/control/concurrency/atom.lux index 455f8b00d..63f9ec296 100644 --- a/stdlib/source/test/lux/control/concurrency/atom.lux +++ b/stdlib/source/test/lux/control/concurrency/atom.lux @@ -1,11 +1,12 @@ (.module: [lux #* ["_" test (#+ Test)] - ["." io] [abstract/monad (#+ do)] data/text/format [math - ["r" random]]] + ["r" random]] + [control + ["." io]]] {1 ["." /]}) diff --git a/stdlib/source/test/lux/control/concurrency/frp.lux b/stdlib/source/test/lux/control/concurrency/frp.lux index 7ac79b465..f9cea5737 100644 --- a/stdlib/source/test/lux/control/concurrency/frp.lux +++ b/stdlib/source/test/lux/control/concurrency/frp.lux @@ -1,12 +1,9 @@ (.module: [lux #* ["_" test (#+ Test)] - ["." io (#+ IO io)] [abstract/monad (#+ do)] [control - [concurrency - ["." promise ("#@." monad)] - ["." atom (#+ Atom atom)]]] + ["." io (#+ IO io)]] [data [number ["." nat]] @@ -15,7 +12,10 @@ [math ["r" random]]] {1 - ["." / (#+ Channel)]}) + ["." / (#+ Channel) + [// + ["." promise ("#@." monad)] + ["." atom (#+ Atom atom)]]]}) (def: #export test Test diff --git a/stdlib/source/test/lux/control/concurrency/promise.lux b/stdlib/source/test/lux/control/concurrency/promise.lux index 5a49f26fe..5a4a41adb 100644 --- a/stdlib/source/test/lux/control/concurrency/promise.lux +++ b/stdlib/source/test/lux/control/concurrency/promise.lux @@ -1,10 +1,10 @@ (.module: [lux #* ["_" test (#+ Test)] - ["." io] [abstract/monad (#+ do)] [control - pipe] + pipe + ["." io]] data/text/format [math ["r" random]]] diff --git a/stdlib/source/test/lux/control/concurrency/semaphore.lux b/stdlib/source/test/lux/control/concurrency/semaphore.lux index 40bd81364..369bc8507 100644 --- a/stdlib/source/test/lux/control/concurrency/semaphore.lux +++ b/stdlib/source/test/lux/control/concurrency/semaphore.lux @@ -3,6 +3,7 @@ [abstract ["." monad (#+ do)]] [control + ["." io] [concurrency ["/" semaphore] ["." promise (#+ Promise)] @@ -13,7 +14,6 @@ format] [collection ["." list ("#;." functor)]]] - ["." io] [math ["r" random]]] lux/test) diff --git a/stdlib/source/test/lux/control/concurrency/stm.lux b/stdlib/source/test/lux/control/concurrency/stm.lux index 9e3b9290c..6b9a65a55 100644 --- a/stdlib/source/test/lux/control/concurrency/stm.lux +++ b/stdlib/source/test/lux/control/concurrency/stm.lux @@ -1,14 +1,9 @@ (.module: [lux #* ["_" test (#+ Test)] - ["." io (#+ IO)] ["M" abstract/monad (#+ do Monad)] [control - [concurrency - ["." atom (#+ Atom atom)] - ["." process] - ["." promise] - ["." frp (#+ Channel)]]] + ["." io (#+ IO)]] [data text/format [number @@ -18,7 +13,12 @@ [math ["r" random]]] {1 - ["." /]}) + ["." / + [// + ["." atom (#+ Atom atom)] + ["." process] + ["." promise] + ["." frp (#+ Channel)]]]}) (def: (read! channel) (All [a] (-> (Channel a) (IO (Atom (List a))))) diff --git a/stdlib/source/test/lux/control/io.lux b/stdlib/source/test/lux/control/io.lux new file mode 100644 index 000000000..1a14558b2 --- /dev/null +++ b/stdlib/source/test/lux/control/io.lux @@ -0,0 +1,42 @@ +(.module: + [lux #* + data/text/format + ["_" test (#+ Test)] + ["r" math/random] + [abstract + [monad (#+ do)] + {[0 #test] + [/ + ["$." functor (#+ Injection Comparison)] + ["$." apply] + ["$." monad]]}]] + {1 + ["." / (#+ IO) + [// + ["." function]]]}) + +(def: injection + (Injection IO) + (|>> /.io)) + +(def: comparison + (Comparison IO) + (function (_ == left right) + (== (/.run left) (/.run right)))) + +(def: #export test + Test + (<| (_.context (%name (name-of /.IO))) + (do r.monad + [sample r.nat + exit-code r.int] + ($_ _.and + ($functor.spec ..injection ..comparison /.functor) + ($apply.spec ..injection ..comparison /.apply) + ($monad.spec ..injection ..comparison /.monad) + + (_.test "Can execute computations designated as I/O computations." + (n/= sample (/.run (/.io sample)))) + (_.test "I/O operations won't execute unless they are explicitly run." + (exec (/.exit exit-code) + true)))))) diff --git a/stdlib/source/test/lux/control/reader.lux b/stdlib/source/test/lux/control/reader.lux index aa639ce70..94aacdb5d 100644 --- a/stdlib/source/test/lux/control/reader.lux +++ b/stdlib/source/test/lux/control/reader.lux @@ -1,6 +1,5 @@ (.module: [lux #* - ["." io (#+ IO)] ["_" test (#+ Test)] [abstract [monad (#+ do)] @@ -15,7 +14,9 @@ [math ["r" random]]] {1 - ["." / (#+ Reader)]}) + ["." / (#+ Reader) + [// + ["." io (#+ IO)]]]}) (def: (injection value) (Injection (All [a r] (Reader r a))) @@ -29,7 +30,7 @@ (def: #export test Test - (<| (_.context (%name (name-of /.Reader))) + (<| (_.context (%name (name-of /._))) (do r.monad [sample r.nat factor r.nat] diff --git a/stdlib/source/test/lux/control/region.lux b/stdlib/source/test/lux/control/region.lux index a575e4250..57ed91c1a 100644 --- a/stdlib/source/test/lux/control/region.lux +++ b/stdlib/source/test/lux/control/region.lux @@ -3,9 +3,6 @@ ["_" test (#+ Test)] [abstract ["." monad (#+ do)]] - [control - ["." thread (#+ Thread)] - ["ex" exception (#+ exception:)]] [data ["." error (#+ Error)] [text @@ -15,7 +12,10 @@ [math ["r" random]]] {1 - ["." /]}) + ["." / + [// + ["." thread (#+ Thread)] + ["ex" exception (#+ exception:)]]]}) (exception: oops) diff --git a/stdlib/source/test/lux/control/state.lux b/stdlib/source/test/lux/control/state.lux index 808d5ebb2..96f9e9d34 100644 --- a/stdlib/source/test/lux/control/state.lux +++ b/stdlib/source/test/lux/control/state.lux @@ -1,7 +1,6 @@ (.module: [lux #* ["_" test (#+ Test)] - ["." io] [abstract [monad (#+ do)] {[0 #test] @@ -10,7 +9,8 @@ ["$." apply] ["$." monad]]}] [control - [pipe (#+ let>)]] + [pipe (#+ let>)] + ["." io]] [data ["." product] [text diff --git a/stdlib/source/test/lux/control/writer.lux b/stdlib/source/test/lux/control/writer.lux index 392fc7a4b..a95384fef 100644 --- a/stdlib/source/test/lux/control/writer.lux +++ b/stdlib/source/test/lux/control/writer.lux @@ -1,7 +1,6 @@ (.module: [lux #* ["_" test (#+ Test)] - ["." io] [abstract [equivalence (#+ Equivalence)] [monoid (#+ Monoid)] @@ -11,6 +10,8 @@ ["$." functor (#+ Injection Comparison)] ["$." apply] ["$." monad]]}] + [control + ["." io]] [data ["." product] ["." text ("#;." equivalence) diff --git a/stdlib/source/test/lux/data/bit.lux b/stdlib/source/test/lux/data/bit.lux index 9515fa5ce..eebca5f2a 100644 --- a/stdlib/source/test/lux/data/bit.lux +++ b/stdlib/source/test/lux/data/bit.lux @@ -3,14 +3,15 @@ data/text/format ["_" test (#+ Test)] ["r" math/random] - ["." function] [abstract [monad (#+ do)] {[0 #test] [/ ["$." equivalence] ["$." monoid] - ["$." codec]]}]] + ["$." codec]]}] + [control + ["." function]]] {1 ["." /]}) diff --git a/stdlib/source/test/lux/data/collection/bits.lux b/stdlib/source/test/lux/data/collection/bits.lux index a727761ca..4b9743912 100644 --- a/stdlib/source/test/lux/data/collection/bits.lux +++ b/stdlib/source/test/lux/data/collection/bits.lux @@ -27,7 +27,7 @@ (def: #export test Test - (<| (_.context (%name (name-of /.Bits))) + (<| (_.context (%name (name-of /._))) ($_ _.and ($equivalence.spec /.equivalence ..bits) (do r.monad @@ -47,7 +47,7 @@ (and (n/= 0 (/.capacity /.empty)) (|> /.empty (/.set idx) /.capacity (n/- idx) - (predicate.union (n/>= 0) + (predicate.unite (n/>= 0) (n/< /.chunk-size))))) (_.test "Bits (must) shrink when (and as much as) possible." (let [grown (/.flip idx /.empty)] diff --git a/stdlib/source/test/lux/data/collection/list.lux b/stdlib/source/test/lux/data/collection/list.lux index 247b2de78..fb97c3d32 100644 --- a/stdlib/source/test/lux/data/collection/list.lux +++ b/stdlib/source/test/lux/data/collection/list.lux @@ -2,7 +2,6 @@ [lux #* data/text/format ["_" test (#+ Test)] - ["." io] [abstract [monad (#+ do)] {[0 #test] @@ -14,7 +13,8 @@ ["$." apply] ["$." monad]]}] [control - pipe] + pipe + ["." io]] [data ["." bit] ["." product] diff --git a/stdlib/source/test/lux/data/error.lux b/stdlib/source/test/lux/data/error.lux index 8f89ccb8f..f65128ec3 100644 --- a/stdlib/source/test/lux/data/error.lux +++ b/stdlib/source/test/lux/data/error.lux @@ -1,7 +1,6 @@ (.module: [lux #* ["_" test (#+ Test)] - ["." io] [abstract [monad (#+ do Monad)] {[0 #test] @@ -11,7 +10,8 @@ ["$." monad] ["$." equivalence]]}] [control - pipe] + pipe + ["." io]] [data text/format [number diff --git a/stdlib/source/test/lux/data/maybe.lux b/stdlib/source/test/lux/data/maybe.lux index dc6ca1d56..a92141bd9 100644 --- a/stdlib/source/test/lux/data/maybe.lux +++ b/stdlib/source/test/lux/data/maybe.lux @@ -10,13 +10,13 @@ ["$." apply] ["$." monad]]}] [control + ["." io ("#@." monad)] pipe] [data ["." text format] [number ["." nat]]] - ["." io ("#@." monad)] [math ["r" random (#+ Random)]]] {1 diff --git a/stdlib/source/test/lux/host/jvm.jvm.lux b/stdlib/source/test/lux/host/jvm.jvm.lux index 16c4aea90..47c6f35d9 100644 --- a/stdlib/source/test/lux/host/jvm.jvm.lux +++ b/stdlib/source/test/lux/host/jvm.jvm.lux @@ -2,6 +2,7 @@ [lux #* [abstract/monad (#+ do)] [control + ["." io (#+ IO)] [concurrency ["." atom]] [security @@ -15,7 +16,6 @@ [collection ["." dictionary] ["." row]]] - ["." io (#+ IO)] [world ["." file (#+ File)] [binary (#+ Binary)]] diff --git a/stdlib/source/test/lux/io.lux b/stdlib/source/test/lux/io.lux deleted file mode 100644 index 3b00ceb3f..000000000 --- a/stdlib/source/test/lux/io.lux +++ /dev/null @@ -1,41 +0,0 @@ -(.module: - [lux #* - data/text/format - ["_" test (#+ Test)] - ["r" math/random] - [abstract - [monad (#+ do)] - {[0 #test] - [/ - ["$." functor (#+ Injection Comparison)] - ["$." apply] - ["$." monad]]}] - ["." function]] - {1 - ["." / (#+ IO)]}) - -(def: injection - (Injection IO) - (|>> /.io)) - -(def: comparison - (Comparison IO) - (function (_ == left right) - (== (/.run left) (/.run right)))) - -(def: #export test - Test - (<| (_.context (%name (name-of /.IO))) - (do r.monad - [sample r.nat - exit-code r.int] - ($_ _.and - ($functor.spec ..injection ..comparison /.functor) - ($apply.spec ..injection ..comparison /.apply) - ($monad.spec ..injection ..comparison /.monad) - - (_.test "Can execute computations designated as I/O computations." - (n/= sample (/.run (/.io sample)))) - (_.test "I/O operations won't execute unless they are explicitly run." - (exec (/.exit exit-code) - true)))))) diff --git a/stdlib/source/test/lux/math.lux b/stdlib/source/test/lux/math.lux index fcd4a1134..c11380015 100644 --- a/stdlib/source/test/lux/math.lux +++ b/stdlib/source/test/lux/math.lux @@ -31,63 +31,64 @@ (def: #export test Test - ($_ _.and - (<| (_.context "Trigonometry") - (do r.monad - [angle (|> r.safe-frac (:: @ map (f/* /.tau)))] - ($_ _.and - (_.test "Sine and arc-sine are inverse functions." - (trigonometric-symmetry /.sin /.asin angle)) - (_.test "Cosine and arc-cosine are inverse functions." - (trigonometric-symmetry /.cos /.acos angle)) - (_.test "Tangent and arc-tangent are inverse functions." - (trigonometric-symmetry /.tan /.atan angle)) - ))) - (<| (_.context "Rounding") - (do r.monad - [sample (|> r.safe-frac (:: @ map (f/* +1000.0)))] - ($_ _.and - (_.test "The ceiling will be an integer value, and will be >= the original." - (let [ceil'd (/.ceil sample)] - (and (|> ceil'd frac-to-int int-to-frac (f/= ceil'd)) - (f/>= sample ceil'd) - (f/<= +1.0 (f/- sample ceil'd))))) - (_.test "The floor will be an integer value, and will be <= the original." - (let [floor'd (/.floor sample)] - (and (|> floor'd frac-to-int int-to-frac (f/= floor'd)) - (f/<= sample floor'd) - (f/<= +1.0 (f/- floor'd sample))))) - (_.test "The round will be an integer value, and will be < or > or = the original." - (let [round'd (/.round sample)] - (and (|> round'd frac-to-int int-to-frac (f/= round'd)) - (f/<= +1.0 (frac@abs (f/- sample round'd)))))) - ))) - (<| (_.context "Exponentials and logarithms") - (do r.monad - [sample (|> r.safe-frac (:: @ map (f/* +10.0)))] - (_.test "Logarithm is the inverse of exponential." - (|> sample /.exp /.log (within? +1.0e-15 sample))))) - (<| (_.context "Greatest-Common-Divisor and Least-Common-Multiple") - (do r.monad - [#let [gen-nat (|> r.nat (:: @ map (|>> (n/% 1000) (n/max 1))))] - x gen-nat - y gen-nat] - ($_ _.and - (_.test "GCD" - (let [gcd (/.n/gcd x y)] - (and (n/= 0 (n/% gcd x)) - (n/= 0 (n/% gcd y)) - (n/>= 1 gcd)))) + (<| (_.context (%name (name-of /._))) + ($_ _.and + (<| (_.context "Trigonometry") + (do r.monad + [angle (|> r.safe-frac (:: @ map (f/* /.tau)))] + ($_ _.and + (_.test "Sine and arc-sine are inverse functions." + (trigonometric-symmetry /.sin /.asin angle)) + (_.test "Cosine and arc-cosine are inverse functions." + (trigonometric-symmetry /.cos /.acos angle)) + (_.test "Tangent and arc-tangent are inverse functions." + (trigonometric-symmetry /.tan /.atan angle)) + ))) + (<| (_.context "Rounding") + (do r.monad + [sample (|> r.safe-frac (:: @ map (f/* +1000.0)))] + ($_ _.and + (_.test "The ceiling will be an integer value, and will be >= the original." + (let [ceil'd (/.ceil sample)] + (and (|> ceil'd frac-to-int int-to-frac (f/= ceil'd)) + (f/>= sample ceil'd) + (f/<= +1.0 (f/- sample ceil'd))))) + (_.test "The floor will be an integer value, and will be <= the original." + (let [floor'd (/.floor sample)] + (and (|> floor'd frac-to-int int-to-frac (f/= floor'd)) + (f/<= sample floor'd) + (f/<= +1.0 (f/- floor'd sample))))) + (_.test "The round will be an integer value, and will be < or > or = the original." + (let [round'd (/.round sample)] + (and (|> round'd frac-to-int int-to-frac (f/= round'd)) + (f/<= +1.0 (frac@abs (f/- sample round'd)))))) + ))) + (<| (_.context "Exponentials and logarithms") + (do r.monad + [sample (|> r.safe-frac (:: @ map (f/* +10.0)))] + (_.test "Logarithm is the inverse of exponential." + (|> sample /.exp /.log (within? +1.0e-15 sample))))) + (<| (_.context "Greatest-Common-Divisor and Least-Common-Multiple") + (do r.monad + [#let [gen-nat (|> r.nat (:: @ map (|>> (n/% 1000) (n/max 1))))] + x gen-nat + y gen-nat] + ($_ _.and + (_.test "GCD" + (let [gcd (/.n/gcd x y)] + (and (n/= 0 (n/% gcd x)) + (n/= 0 (n/% gcd y)) + (n/>= 1 gcd)))) - (_.test "LCM" - (let [lcm (/.n/lcm x y)] - (and (n/= 0 (n/% x lcm)) - (n/= 0 (n/% y lcm)) - (n/<= (n/* x y) lcm)))) - ))) + (_.test "LCM" + (let [lcm (/.n/lcm x y)] + (and (n/= 0 (n/% x lcm)) + (n/= 0 (n/% y lcm)) + (n/<= (n/* x y) lcm)))) + ))) - /infix.test - /modular.test - /logic/continuous.test - /logic/fuzzy.test - )) + /infix.test + /modular.test + /logic/continuous.test + /logic/fuzzy.test + ))) diff --git a/stdlib/source/test/lux/math/infix.lux b/stdlib/source/test/lux/math/infix.lux index db40f693c..5224700a5 100644 --- a/stdlib/source/test/lux/math/infix.lux +++ b/stdlib/source/test/lux/math/infix.lux @@ -12,7 +12,7 @@ (def: #export test Test - (<| (_.context (%name (name-of /.infix))) + (<| (_.context (%name (name-of /._))) (do r.monad [subject r.nat parameter r.nat diff --git a/stdlib/source/test/lux/type/resource.lux b/stdlib/source/test/lux/type/resource.lux index 293629e18..92b085e6a 100644 --- a/stdlib/source/test/lux/type/resource.lux +++ b/stdlib/source/test/lux/type/resource.lux @@ -6,7 +6,8 @@ [abstract [monad [indexed (#+ do)]]] - ["." io]] + [control + ["." io]]] {1 ["." / (#+ Res)]}) diff --git a/stdlib/source/test/lux/world/file.lux b/stdlib/source/test/lux/world/file.lux index 86b031660..b72e8be82 100644 --- a/stdlib/source/test/lux/world/file.lux +++ b/stdlib/source/test/lux/world/file.lux @@ -5,11 +5,11 @@ ["_" test (#+ Test)] [abstract/monad (#+ do)] [control + ["." io (#+ IO)] [concurrency ["." promise]] [security ["!" capability]]] - ["." io (#+ IO)] [data ["." error (#+ Error)] ["." text] diff --git a/stdlib/source/test/lux/world/net/tcp.lux b/stdlib/source/test/lux/world/net/tcp.lux index b3f9a6d0d..fb4983302 100644 --- a/stdlib/source/test/lux/world/net/tcp.lux +++ b/stdlib/source/test/lux/world/net/tcp.lux @@ -4,9 +4,9 @@ ["r" math/random (#+ Random)] ["_" test (#+ Test)] ["." abstract/monad (#+ do)] - ["." io (#+ IO)] [control ["ex" exception (#+ exception:)] + ["." io (#+ IO)] [concurrency ["." promise (#+ Promise Resolver)] ["." frp ("#@." functor)]] diff --git a/stdlib/source/test/lux/world/net/udp.lux b/stdlib/source/test/lux/world/net/udp.lux index 2e61257ad..44765acab 100644 --- a/stdlib/source/test/lux/world/net/udp.lux +++ b/stdlib/source/test/lux/world/net/udp.lux @@ -5,6 +5,7 @@ ["_" test (#+ Test)] ["." abstract/monad (#+ do)] [control + ["." io] [concurrency ["." promise]] [security @@ -12,7 +13,6 @@ [data ["." error] ["." text]] - ["." io] [world ["." binary] ["." net]]] -- cgit v1.2.3