1
1
package kategory
2
2
3
- import kategory.typeclasses.Alternative
4
-
5
3
/* *
6
4
* https://www.youtube.com/watch?v=wvSP5qYiz4Y
7
5
*/
@@ -10,9 +8,15 @@ interface ComposedType<out F, out G>
10
8
@Suppress(" UNCHECKED_CAST" )
11
9
fun <F , G , A > HK <F , HK <G , A >>.lift (): HK <ComposedType <F , G >, A> = this as HK <ComposedType <F , G >, A >
12
10
11
+ @Suppress(" UNCHECKED_CAST" )
12
+ fun <F , G , A , B > HK2 <F , HK2 <G , A , B >, HK2 <G , A , B >>.liftB (): HK2 <ComposedType <F , G >, A, B> = this as HK2 <ComposedType <F , G >, A , B >
13
+
13
14
@Suppress(" UNCHECKED_CAST" )
14
15
fun <F , G , A > HK <ComposedType <F , G >, A>.lower (): HK <F , HK <G , A >> = this as HK <F , HK <G , A >>
15
16
17
+ @Suppress(" UNCHECKED_CAST" )
18
+ fun <F , G , A , B > HK2 <ComposedType <F , G >, A , B>.lowerB (): HK2 <F , HK2 <G , A , B >, HK2<G, A, B>> = this as HK2 <F , HK2 <G , A , B >, HK2 <G , A , B >>
19
+
16
20
interface ComposedFoldable <F , G > :
17
21
Foldable <ComposedType <F , G >> {
18
22
@@ -219,3 +223,36 @@ interface ComposedFunctorFilter<F, G> : FunctorFilter<ComposedType<F, G>>, Compo
219
223
220
224
inline fun <reified F , reified G > Functor<F>.composeFilter (FFG : FunctorFilter <G > = functorFilter()):
221
225
FunctorFilter <ComposedType <F , G >> = ComposedFunctorFilter (this , FFG )
226
+
227
+ interface ComposedBifoldable <F , G > : Bifoldable <ComposedType <F , G >> {
228
+ fun F (): Bifoldable <F >
229
+
230
+ fun G (): Bifoldable <G >
231
+
232
+ override fun <A , B , C > bifoldLeft (fab : HK2 <ComposedType <F , G >, A , B >, c : C , f : (C , A ) -> C , g : (C , B ) -> C ): C =
233
+ F ().bifoldLeft(fab.lowerB(), c,
234
+ { cc: C , gab: HK2 <G , A , B > -> G ().bifoldLeft(gab, cc, f, g) },
235
+ { cc: C , gab: HK2 <G , A , B > -> G ().bifoldLeft(gab, cc, f, g) })
236
+
237
+ override fun <A , B , C > bifoldRight (fab : HK2 <ComposedType <F , G >, A , B >, c : Eval <C >, f : (A , Eval <C >) -> Eval <C >, g : (B , Eval <C >) -> Eval <C >): Eval <C > =
238
+ F ().bifoldRight(fab.lowerB(), c,
239
+ { gab: HK2 <G , A , B >, cc: Eval <C > -> G ().bifoldRight(gab, cc, f, g) },
240
+ { gab: HK2 <G , A , B >, cc: Eval <C > -> G ().bifoldRight(gab, cc, f, g) })
241
+
242
+ fun <A , B , C > bifoldLeftC (fab : HK2 <F , HK2 <G , A , B >, HK2 <G , A , B >>, c : C , f : (C , A ) -> C , g : (C , B ) -> C ): C =
243
+ bifoldLeft(fab.liftB(), c, f, g)
244
+
245
+ fun <A , B , C > bifoldRightC (fab : HK2 <F , HK2 <G , A , B >, HK2 <G , A , B >>, c : Eval <C >, f : (A , Eval <C >) -> Eval <C >, g : (B , Eval <C >) -> Eval <C >): Eval <C > =
246
+ bifoldRight(fab.liftB(), c, f, g)
247
+
248
+ companion object {
249
+ operator fun <F , G > invoke (BF : Bifoldable <F >, BG : Bifoldable <G >): ComposedBifoldable <F , G > =
250
+ object : ComposedBifoldable <F , G > {
251
+ override fun F (): Bifoldable <F > = BF
252
+
253
+ override fun G (): Bifoldable <G > = BG
254
+ }
255
+ }
256
+ }
257
+
258
+ inline fun <reified F , reified G > Bifoldable<F>.compose (BG : Bifoldable <G > = bifoldable()): Bifoldable <ComposedType <F , G >> = ComposedBifoldable (this , BG )
0 commit comments