@@ -6,6 +6,9 @@ trait Function1Syntax {
66  implicit  def  catsSyntaxFunction1 [F [_]:  Functor , A , B ](fab : F [Function1 [A , B ]]):  Function1Ops [F , A , B ] = 
77    new  Function1Ops [F , A , B ](fab)
88
9+   implicit  def  catsSyntaxFunction1FlatMap [F [_]:  FlatMap , A , B ](fab : Function1 [A , F [B ]]):  Function1FlatMapOps [F , A , B ] = 
10+     new  Function1FlatMapOps [F , A , B ](fab)
11+ 
912  final  class  Function1Ops [F [_]:  Functor , A , B ](fab : F [Function1 [A , B ]]) {
1013
1114    /**  
@@ -30,4 +33,57 @@ trait Function1Syntax {
3033     */  
3134    def  mapApply (a : A ):  F [B ] =  Functor [F ].map(fab)(_(a))
3235  }
36+ 
37+   final  class  Function1FlatMapOps [F [_]:  FlatMap , A , B ](f : A  =>  F [B ]) {
38+ 
39+     /**  
40+      * Alias for `a => f(a).flatMap(g)` or `(Kleisli(f) andThen Kleisli(g)).run` 
41+      * 
42+      * Example: 
43+      * {{{ 
44+      * scala> import scala.util._ 
45+      * scala> import cats.implicits._ 
46+      * 
47+      * scala> val f: List[String] => Option[String] = _.headOption 
48+      * scala> val g: String => Option[Int] = str => Try(str.toInt).toOption 
49+      * scala> (f >=> g)(List("42")) 
50+      * res0: Option[Int] = Some(42) 
51+      * scala> (f andThenF g)(List("abc")) 
52+      * res1: Option[Int] = None 
53+      * scala> (f andThenF g)(List()) 
54+      * res2: Option[Int] = None 
55+      * }}} 
56+      */  
57+     def  andThenF [C ](g : B  =>  F [C ]):  A  =>  F [C ] =  a =>  FlatMap [F ].flatMap(f(a))(g)
58+ 
59+     /**  
60+      * Alias for `f andThenF g`. 
61+      */  
62+     @ inline def  >=> [C ](g : B  =>  F [C ]):  A  =>  F [C ] =  f.andThenF(g)
63+ 
64+     /**  
65+      * Alias for `c => g(c).flatMap(f)` or `(Kleisli(f) compose Kleisli(g)).run` 
66+      * 
67+      * Example: 
68+      * {{{ 
69+      * scala> import scala.util._ 
70+      * scala> import cats.implicits._ 
71+      * 
72+      * scala> val f: String => Option[Int] = str => Try(str.toInt).toOption 
73+      * scala> val g: List[String] => Option[String] = _.headOption 
74+      * scala> (f composeF g)(List("42")) 
75+      * res0: Option[Int] = Some(42) 
76+      * scala> (f composeF g)(List("abc")) 
77+      * res1: Option[Int] = None 
78+      * scala> (f composeF g)(List()) 
79+      * res2: Option[Int] = None 
80+      * }}} 
81+      */  
82+     def  composeF [C ](g : C  =>  F [A ]):  C  =>  F [B ] =  c =>  FlatMap [F ].flatMap(g(c))(f)
83+ 
84+     /**  
85+      * Alias for `f composeF g`. 
86+      */  
87+     @ inline def  <=< [C ](g : C  =>  F [A ]):  C  =>  F [B ] =  f.composeF(g)
88+   }
3389}
0 commit comments