Skip to content

Instantly share code, notes, and snippets.

@halcat0x15a
Created December 14, 2011 13:49
Show Gist options
  • Save halcat0x15a/1476637 to your computer and use it in GitHub Desktop.
Save halcat0x15a/1476637 to your computer and use it in GitHub Desktop.
case class ScalaChan[A](value: A)
implicit def ScalaChanEqual[A]: Equal[ScalaChan[A]] = equalA
implicit def ScalaChanShow[A]: Show[ScalaChan[A]] = showA
implicit lazy val ScalaChanPure: Pure[ScalaChan] = new Pure[ScalaChan] {
def pure[A](a: => A): ScalaChan[A] = ScalaChan(a)
}
implicit lazy val ScalaChanBind: Bind[ScalaChan] = new Bind[ScalaChan] {
def bind[A, B](a: ScalaChan[A], f: A => ScalaChan[B]): ScalaChan[B] = f(a.value)
}
def f[A[_]: Monad, B: Semigroup](a: A[B]) = for {
i <- a
j <- a
} yield i |+| j
f(100.some) assert_=== 200.some
f(ScalaChan("Scala")) assert_=== ScalaChan("ScalaScala")
implicit lazy val ScalaChanMonad: Monad[ScalaChan] = new Monad[ScalaChan] {
def pure[A](a: => A): ScalaChan[A] = ScalaChan(a)
def bind[A, B](a: ScalaChan[A], f: A => ScalaChan[B]): ScalaChan[B] = f(a.value)
}
'Scalaz.wrapNel.getOrElseM('Scala.some.wrapNel) assert_=== NonEmptyList('Scala)
'Scalaz.wrapNel.getOrElseM(none.wrapNel) assert_=== NonEmptyList('Scalaz)
true.some.ifM('Scalaz.some, 'Scala.some) assert_=== Option('Scalaz)
nel(false, true, false).ifM('イカちゃん.wrapNel, 'Scalaちゃん.wrapNel) assert_=== NonEmptyList('Scalaちゃん,'イカちゃん,'Scalaちゃん)
'Z'.some.replicate[List](5) assert_=== List(Option('Z'), Option('Z'), Option('Z'), Option('Z'), Option('Z'))
'Z'.some.replicateM[List](3) assert_=== Option(List('Z', 'Z', 'Z'))
nel(1, 2, 3).foldLeftM(mzero[Int])(_ |+| _ |> (i => (i % 2 === 0).option(i)))
nel(1, 2, 3).foldLeftM(mzero[Int])(_.replicate[List](_)) assert_=== List(0, 0, 0, 0, 0, 0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment