package scalaz
package std.java.util.concurrent

import java.util.concurrent.Callable


trait CallableInstances {
  implicit def callableOrder[A: Order] = new Order[Callable[A]] {
    def order(f1: Callable[A], f2: Callable[A]) = Order[A].order(f1.call, f2.call)
  }

  implicit def callableMonad: Monad[Callable] = new Monad[Callable] {
    override def map[A, B](fa: Callable[A])(f: A => B) = new Callable[B] {
      def call() = f(fa.call)
    }
    def bind[A, B](fa: Callable[A])(f: A => Callable[B]) = new Callable[B] {
      def call() = f(fa.call).call
    }
    def point[A](a: => A) = new Callable[A] {
      def call() = a
    }
  }
}

object callable extends CallableInstances