aboutsummaryrefslogtreecommitdiff
path: root/stdlib/test/test/lux/control/reader.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/test/test/lux/control/reader.lux')
-rw-r--r--stdlib/test/test/lux/control/reader.lux37
1 files changed, 37 insertions, 0 deletions
diff --git a/stdlib/test/test/lux/control/reader.lux b/stdlib/test/test/lux/control/reader.lux
new file mode 100644
index 000000000..85b5edf8b
--- /dev/null
+++ b/stdlib/test/test/lux/control/reader.lux
@@ -0,0 +1,37 @@
+(;module:
+ lux
+ (lux [io]
+ (control monad
+ pipe
+ ["&" reader])
+ (data [text "Text/" Monoid<Text>]
+ text/format
+ [number]))
+ lux/test)
+
+(test: "Readers"
+ ($_ seq
+ (assert "" (i.= 123 (&;run 123 &;ask)))
+ (assert "" (i.= 246 (&;run 123 (&;local (i.* 2) &;ask))))
+ (assert "" (i.= 134 (&;run 123 (:: &;Functor<Reader> map i.inc (i.+ 10)))))
+ (assert "" (i.= 10 (&;run 123 (:: &;Applicative<Reader> wrap 10))))
+ (assert "" (i.= 30 (&;run 123 (let [(^open "&/") &;Applicative<Reader>]
+ (&/apply (&/wrap (i.+ 10)) (&/wrap 20))))))
+ (assert "" (i.= 30 (&;run 123 (do &;Monad<Reader>
+ [f (wrap i.+)
+ x (wrap 10)
+ y (wrap 20)]
+ (wrap (f x y))))))))
+
+(test: "Monad transformer"
+ (let [(^open "io/") io;Monad<IO>]
+ (assert "Can add reader functionality to any monad."
+ (|> (do (&;ReaderT io;Monad<IO>)
+ [a (&;lift-reader (io/wrap 123))
+ b (wrap 456)]
+ (wrap (i.+ a b)))
+ (&;run "")
+ io;run
+ (case> 579 true
+ _ false)))
+ ))