From 8e6c5fc029178674275758f7c68425b13a473208 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Mon, 4 Sep 2017 20:01:01 -0400 Subject: - Renamed "Log" to "Writer". --- stdlib/source/lux/control/writer.lux | 59 +++++++++++++++++++++++++++++++++ stdlib/source/lux/data/log.lux | 59 --------------------------------- stdlib/test/test/lux/control/writer.lux | 43 ++++++++++++++++++++++++ stdlib/test/test/lux/data/log.lux | 43 ------------------------ stdlib/test/tests.lux | 2 +- 5 files changed, 103 insertions(+), 103 deletions(-) create mode 100644 stdlib/source/lux/control/writer.lux delete mode 100644 stdlib/source/lux/data/log.lux create mode 100644 stdlib/test/test/lux/control/writer.lux delete mode 100644 stdlib/test/test/lux/data/log.lux diff --git a/stdlib/source/lux/control/writer.lux b/stdlib/source/lux/control/writer.lux new file mode 100644 index 000000000..6a82df77c --- /dev/null +++ b/stdlib/source/lux/control/writer.lux @@ -0,0 +1,59 @@ +(;module: + lux + (lux/control monoid + ["A" applicative #*] + functor + [monad #+ do Monad])) + +(type: #export (Writer l a) + {#;doc "Represents a value with an associated 'log' value to record arbitrary information."} + {#log l + #value a}) + +(struct: #export Functor (All [l] + (Functor (Writer l))) + (def: (map f fa) + (let [[log datum] fa] + [log (f datum)]))) + +(struct: #export (Applicative mon) (All [l] + (-> (Monoid l) (Applicative (Writer l)))) + (def: functor Functor) + + (def: (wrap x) + [(:: mon unit) x]) + + (def: (apply ff fa) + (let [[log1 f] ff + [log2 a] fa] + [(:: mon append log1 log2) (f a)]))) + +(struct: #export (Monad mon) (All [l] + (-> (Monoid l) (Monad (Writer l)))) + (def: applicative (Applicative mon)) + + (def: (join mma) + (let [[log1 [log2 a]] mma] + [(:: mon append log1 log2) a]))) + +(def: #export (log l) + {#;doc "Set the log to a particular value."} + (All [l] (-> l (Writer l Unit))) + [l []]) + +(struct: #export (WriterT Monoid Monad) + (All [l M] (-> (Monoid l) (Monad M) (Monad (All [a] (M (Writer l a)))))) + (def: applicative (A;compA (get@ #monad;applicative Monad) (Applicative Monoid))) + (def: (join MlMla) + (do Monad + [[l1 Mla] (: (($ +1) (Writer ($ +0) (($ +1) (Writer ($ +0) ($ +2))))) + MlMla) + [l2 a] Mla] + (wrap [(:: Monoid append l1 l2) a])))) + +(def: #export (lift Monoid Monad) + (All [l M a] (-> (Monoid l) (Monad M) (-> (M a) (M (Writer l a))))) + (function [ma] + (do Monad + [a ma] + (wrap [(:: Monoid unit) a])))) diff --git a/stdlib/source/lux/data/log.lux b/stdlib/source/lux/data/log.lux deleted file mode 100644 index 19753199f..000000000 --- a/stdlib/source/lux/data/log.lux +++ /dev/null @@ -1,59 +0,0 @@ -(;module: - lux - (lux/control monoid - ["A" applicative #*] - functor - [monad #+ do Monad])) - -(type: #export (Log l a) - {#;doc "Represents a value with an associated 'log' value to record arbitrary information."} - {#log l - #value a}) - -(struct: #export Functor (All [l] - (Functor (Log l))) - (def: (map f fa) - (let [[log datum] fa] - [log (f datum)]))) - -(struct: #export (Applicative mon) (All [l] - (-> (Monoid l) (Applicative (Log l)))) - (def: functor Functor) - - (def: (wrap x) - [(:: mon unit) x]) - - (def: (apply ff fa) - (let [[log1 f] ff - [log2 a] fa] - [(:: mon append log1 log2) (f a)]))) - -(struct: #export (Monad mon) (All [l] - (-> (Monoid l) (Monad (Log l)))) - (def: applicative (Applicative mon)) - - (def: (join mma) - (let [[log1 [log2 a]] mma] - [(:: mon append log1 log2) a]))) - -(def: #export (log l) - {#;doc "Set the log to a particular value."} - (All [l] (-> l (Log l Unit))) - [l []]) - -(struct: #export (LogT Monoid Monad) - (All [l M] (-> (Monoid l) (Monad M) (Monad (All [a] (M (Log l a)))))) - (def: applicative (A;compA (get@ #monad;applicative Monad) (Applicative Monoid))) - (def: (join MlMla) - (do Monad - [[l1 Mla] (: (($ +1) (Log ($ +0) (($ +1) (Log ($ +0) ($ +2))))) - MlMla) - [l2 a] Mla] - (wrap [(:: Monoid append l1 l2) a])))) - -(def: #export (lift Monoid Monad) - (All [l M a] (-> (Monoid l) (Monad M) (-> (M a) (M (Log l a))))) - (function [ma] - (do Monad - [a ma] - (wrap [(:: Monoid unit) a])))) diff --git a/stdlib/test/test/lux/control/writer.lux b/stdlib/test/test/lux/control/writer.lux new file mode 100644 index 000000000..8c9e1c676 --- /dev/null +++ b/stdlib/test/test/lux/control/writer.lux @@ -0,0 +1,43 @@ +(;module: + lux + (lux [io] + (control ["M" monad #+ do Monad] + pipe + ["&" writer]) + (data [text "Text/" Monoid Eq] + [number] + [product])) + lux/test) + +(context: "Writer." + (let [(^open "&/") (&;Monad text;Monoid)] + ($_ seq + (test "Functor respects Writer." + (i.= 11 (product;right (&/map i.inc ["" 10])))) + + (test "Applicative respects Writer." + (and (i.= 20 (product;right (&/wrap 20))) + (i.= 30 (product;right (&/apply (&/wrap (i.+ 10)) (&/wrap 20)))))) + + (test "Monad respects Writer." + (i.= 30 (product;right (do (&;Monad text;Monoid) + [f (wrap i.+) + a (wrap 10) + b (wrap 20)] + (wrap (f a b)))))) + + (test "Can log any value." + (Text/= "YOLO" (product;left (&;log "YOLO")))) + ))) + +(context: "Monad transformer" + (let [lift (&;lift text;Monoid io;Monad) + (^open "io/") io;Monad] + (test "Can add writer functionality to any monad." + (|> (io;run (do (&;WriterT text;Monoid io;Monad) + [a (lift (io/wrap 123)) + b (wrap 456)] + (wrap (i.+ a b)))) + (case> ["" 579] true + _ false))) + )) diff --git a/stdlib/test/test/lux/data/log.lux b/stdlib/test/test/lux/data/log.lux deleted file mode 100644 index bcd3a1a56..000000000 --- a/stdlib/test/test/lux/data/log.lux +++ /dev/null @@ -1,43 +0,0 @@ -(;module: - lux - (lux [io] - (control ["M" monad #+ do Monad] - pipe) - (data ["&" log] - [text "Text/" Monoid Eq] - [number] - [product])) - lux/test) - -(context: "Logs" - (let [(^open "&/") (&;Monad text;Monoid)] - ($_ seq - (test "Functor respects Log." - (i.= 11 (product;right (&/map i.inc ["" 10])))) - - (test "Applicative respects Log." - (and (i.= 20 (product;right (&/wrap 20))) - (i.= 30 (product;right (&/apply (&/wrap (i.+ 10)) (&/wrap 20)))))) - - (test "Monad respects Log." - (i.= 30 (product;right (do (&;Monad text;Monoid) - [f (wrap i.+) - a (wrap 10) - b (wrap 20)] - (wrap (f a b)))))) - - (test "Can log any value." - (Text/= "YOLO" (product;left (&;log "YOLO")))) - ))) - -(context: "Monad transformer" - (let [lift (&;lift text;Monoid io;Monad) - (^open "io/") io;Monad] - (test "Can add log functionality to any monad." - (|> (io;run (do (&;LogT text;Monoid io;Monad) - [a (lift (io/wrap 123)) - b (wrap 456)] - (wrap (i.+ a b)))) - (case> ["" 579] true - _ false))) - )) diff --git a/stdlib/test/tests.lux b/stdlib/test/tests.lux index fffe409c4..9b0f8ff11 100644 --- a/stdlib/test/tests.lux +++ b/stdlib/test/tests.lux @@ -23,6 +23,7 @@ ["_;" pipe] ["_;" cont] ["_;" reader] + ["_;" writer] ["_;" state] ["_;" parser]) (data ["_;" bit] @@ -30,7 +31,6 @@ ["_;" result] ["_;" ident] ["_;" identity] - ["_;" log] ["_;" maybe] ["_;" number] ["_;" product] -- cgit v1.2.3