/
cobind.scala
35 lines (26 loc) · 1015 Bytes
/
cobind.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package scalaz
package tc
import scala.{ List, Option, Some }
import scala.language.experimental.macros
@meta.minimal("cobind", "cojoin")
trait CobindClass[F[_]] extends FunctorClass[F] {
def cobind[A, B](fa: F[A])(f: F[A] => B): F[B] = map(cojoin(fa))(f)
def cojoin[A](fa: F[A]): F[F[A]] = cobind(fa)(x => x)
}
object CobindClass {
implicit val optionCobind: Cobind[Option] = instanceOf(new CobindClass[Option] {
override def map[A, B](fa: Option[A])(f: A => B): Option[B] = fa.map(f)
override def cobind[A, B](fa: Option[A])(f: Option[A] => B): Option[B] =
Some(f(fa))
})
implicit val listCobind: Cobind[List] = instanceOf(new CobindClass[List] {
override def map[A, B](fa: List[A])(f: A => B): List[B] = fa.map(f)
override def cobind[A, B](fa: List[A])(f: List[A] => B): List[B] =
List(f(fa))
})
}
trait CobindSyntax {
implicit final class ToCobindOps[F[_], A](fa: F[A]) {
def cobind[B](f: F[A] => B)(implicit ev: Cobind[F]): F[B] = macro ops.Ops.i_1
}
}