/scalacheck-binding/src/main/scala/scalaz/scalacheck/ScalaCheckBinding.scala

http://github.com/scalaz/scalaz · Scala · 42 lines · 32 code · 6 blank · 4 comment · 0 complexity · d440e4b4320ca5ebc04accbeda7f09d7 MD5 · raw file

  1. package scalaz
  2. package scalacheck
  3. /**
  4. * Type class instances for types from [[https://github.com/rickynils/scalacheck Scalacheck]]
  5. */
  6. object ScalaCheckBinding {
  7. import org.scalacheck.{Cogen, Gen, Arbitrary, Shrink}
  8. import Gen.{sized, const}
  9. implicit val ArbitraryMonad: Monad[Arbitrary] = new Monad[Arbitrary] {
  10. def bind[A, B](fa: Arbitrary[A])(f: A => Arbitrary[B]) = Arbitrary(fa.arbitrary.flatMap(f(_).arbitrary))
  11. def point[A](a: => A) = Arbitrary(sized(_ => const(a)))
  12. override def map[A, B](fa: Arbitrary[A])(f: A => B) = Arbitrary(fa.arbitrary.map(f))
  13. }
  14. implicit val GenMonad: Monad[Gen] = new Monad[Gen] {
  15. def point[A](a: => A) = sized(_ => const(a))
  16. def bind[A, B](fa: Gen[A])(f: A => Gen[B]) = fa flatMap f
  17. override def map[A, B](fa: Gen[A])(f: A => B) = fa map f
  18. }
  19. implicit val CogenInstance: Divisible[Cogen] = new Divisible[Cogen] {
  20. override def contramap[A, B](a: Cogen[A])(f: B => A) =
  21. a contramap f
  22. override def conquer[A] =
  23. Cogen((seed, _) => seed)
  24. override def divide2[A, B, C](fa: =>Cogen[A], fb: =>Cogen[B])(f: C => (A, B)) =
  25. Cogen{ (seed, c) =>
  26. val (a, b) = f(c)
  27. fb.perturb(fa.perturb(seed, a), b)
  28. }
  29. }
  30. implicit val ShrinkFunctor: InvariantFunctor[Shrink] =
  31. new InvariantFunctor[Shrink] {
  32. def xmap[A, B](ma: Shrink[A], f: A => B, g: B => A): Shrink[B] =
  33. Shrink{b => ma shrink g(b) map f}
  34. }
  35. }
  36. // vim: expandtab:ts=2:sw=2