aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/spec/lux/abstract/monoid.lux
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--stdlib/source/spec/lux/abstract/monoid.lux31
1 files changed, 31 insertions, 0 deletions
diff --git a/stdlib/source/spec/lux/abstract/monoid.lux b/stdlib/source/spec/lux/abstract/monoid.lux
new file mode 100644
index 000000000..eca057360
--- /dev/null
+++ b/stdlib/source/spec/lux/abstract/monoid.lux
@@ -0,0 +1,31 @@
+(.module:
+ [lux #*
+ ["_" test (#+ Test)]
+ [abstract
+ [monad (#+ do)]]
+ [math
+ ["." random (#+ Random)]]]
+ {1
+ ["." /
+ [//
+ [equivalence (#+ Equivalence)]]]})
+
+(def: #export (spec (^open "/@.") (^open "/@.") gen-sample)
+ (All [a] (-> (Equivalence a) (/.Monoid a) (Random a) Test))
+ (do random.monad
+ [sample gen-sample
+ left gen-sample
+ mid gen-sample
+ right gen-sample]
+ (<| (_.with-cover [/.Monoid])
+ ($_ _.and
+ (_.test "Left identity."
+ (/@= sample
+ (/@compose /@identity sample)))
+ (_.test "Right identity."
+ (/@= sample
+ (/@compose sample /@identity)))
+ (_.test "Associativity."
+ (/@= (/@compose left (/@compose mid right))
+ (/@compose (/@compose left mid) right)))
+ ))))