aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/control/function/mixin.lux
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--stdlib/source/library/lux/control/function/mixin.lux64
1 files changed, 64 insertions, 0 deletions
diff --git a/stdlib/source/library/lux/control/function/mixin.lux b/stdlib/source/library/lux/control/function/mixin.lux
new file mode 100644
index 000000000..f70b2f9c3
--- /dev/null
+++ b/stdlib/source/library/lux/control/function/mixin.lux
@@ -0,0 +1,64 @@
+## Inspired by;
+## "The Different Aspects of Monads and Mixins" by Bruno C. d. S. Oliveira
+
+(.module:
+ [library
+ [lux #*
+ [abstract
+ [monoid (#+ Monoid)]
+ [predicate (#+ Predicate)]
+ [monad (#+ Monad do)]]]])
+
+(type: #export (Mixin i o)
+ (-> (-> i o) (-> i o) (-> i o)))
+
+(def: #export (mixin f)
+ (All [i o] (-> (Mixin i o) (-> i o)))
+ (function (mix input)
+ ((f mix mix) input)))
+
+(def: #export nothing
+ Mixin
+ (function (_ delegate recur)
+ delegate))
+
+(def: #export (inherit parent child)
+ (All [i o] (-> (Mixin i o) (Mixin i o) (Mixin i o)))
+ (function (_ delegate recur)
+ (parent (child delegate recur) recur)))
+
+(implementation: #export monoid
+ (All [i o] (Monoid (Mixin i o)))
+
+ (def: identity ..nothing)
+ (def: compose ..inherit))
+
+(def: #export (advice when then)
+ (All [i o] (-> (Predicate i) (Mixin i o) (Mixin i o)))
+ (function (_ delegate recur input)
+ (if (when input)
+ ((then delegate recur) input)
+ (delegate input))))
+
+(def: #export (before monad action)
+ (All [! i o] (-> (Monad !) (-> i (! Any)) (Mixin i (! o))))
+ (function (_ delegate recur input)
+ (do monad
+ [_ (action input)]
+ (delegate input))))
+
+(def: #export (after monad action)
+ (All [! i o] (-> (Monad !) (-> i o (! Any)) (Mixin i (! o))))
+ (function (_ delegate recur input)
+ (do monad
+ [output (delegate input)
+ _ (action input output)]
+ (wrap output))))
+
+(type: #export (Recursive i o)
+ (-> (-> i o) (-> i o)))
+
+(def: #export (from-recursive recursive)
+ (All [i o] (-> (Recursive i o) (Mixin i o)))
+ (function (_ delegate recur)
+ (recursive recur)))