aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/abstract/functor.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/library/lux/abstract/functor.lux')
-rw-r--r--stdlib/source/library/lux/abstract/functor.lux45
1 files changed, 45 insertions, 0 deletions
diff --git a/stdlib/source/library/lux/abstract/functor.lux b/stdlib/source/library/lux/abstract/functor.lux
new file mode 100644
index 000000000..fb56625e8
--- /dev/null
+++ b/stdlib/source/library/lux/abstract/functor.lux
@@ -0,0 +1,45 @@
+(.module: [library
+ lux])
+
+(interface: #export (Functor f)
+ (: (All [a b]
+ (-> (-> a b)
+ (-> (f a) (f b))))
+ map))
+
+(type: #export (Fix f)
+ (f (Fix f)))
+
+(type: #export (Or f g)
+ (All [a] (| (f a) (g a))))
+
+(def: #export (sum (^open "f\.") (^open "g\."))
+ (All [F G] (-> (Functor F) (Functor G) (Functor (..Or F G))))
+ (implementation
+ (def: (map f fa|ga)
+ (case fa|ga
+ (#.Left fa)
+ (#.Left (f\map f fa))
+
+ (#.Right ga)
+ (#.Right (g\map f ga))))))
+
+(type: #export (And f g)
+ (All [a] (& (f a) (g a))))
+
+(def: #export (product (^open "f\.") (^open "g\."))
+ (All [F G] (-> (Functor F) (Functor G) (Functor (..And F G))))
+ (implementation
+ (def: (map f [fa ga])
+ [(f\map f fa)
+ (g\map f ga)])))
+
+(type: #export (Then f g)
+ (All [a] (f (g a))))
+
+(def: #export (compose (^open "f\.") (^open "g\."))
+ {#.doc "Functor composition."}
+ (All [F G] (-> (Functor F) (Functor G) (Functor (..Then F G))))
+ (implementation
+ (def: (map f fga)
+ (f\map (g\map f) fga))))