package scalaz
sealed trait BooleanW {
val isTrue: Boolean
import Scalaz._
def |∧| : BooleanConjunction = conjunction(isTrue)
def ∧(q: => BooleanW) = isTrue && q.isTrue
def ∨(q: => BooleanW) = isTrue || q.isTrue
def ⊽(q: => BooleanW) = !isTrue || !q.isTrue
def ⊼(q: => BooleanW) = !isTrue && !q.isTrue
def →(q: => BooleanW) = !isTrue || q.isTrue
def ⇐(q: => BooleanW) = isTrue || !q.isTrue
def ⇏(q: => BooleanW) = isTrue && !q.isTrue
def ⇍(q: => BooleanW) = !isTrue && q.isTrue
def !(t: => Unit) = if(isTrue) t
def unless(f: => Unit) = if(!isTrue) f
def when(f: => Unit) = if(isTrue) f
def fold[A](a: => A, b: => A): A = if (isTrue) a else b
trait Conditional[X] {
def |(f: => X): X
}
def ?[X](t: => X) = new Conditional[X] {
def |(f: => X) = if(isTrue) t else f
}
def option[A](a: => A) = if(isTrue) Some(a) else None
trait ConditionalEither[A] {
def or[B](b: => B): Either[A, B]
}
def either[A, B](a: => A) = new ConditionalEither[A] {
def or[B](b: => B) = if(isTrue) Left(a) else Right(b)
}
def ??[A: Zero](a: => A): A = if(isTrue) a else ∅
def !?[A: Zero](a: => A): A = if(!isTrue) a else ∅
trait GuardPrevent[M[_]] {
def apply[A](a: => A)(implicit e: Empty[M], p: Pure[M]): M[A]
}
def guard[M[_]] = new GuardPrevent[M] {
def apply[A](a: => A)(implicit e: Empty[M], p: Pure[M]) = if(isTrue) a η else <∅>
}
def prevent[M[_]] = new GuardPrevent[M] {
def apply[A](a: => A)(implicit e: Empty[M], p: Pure[M]) = if(isTrue) <∅> else a η
}
}
trait Booleans {
implicit def BooleanTo(b: Boolean): BooleanW = new BooleanW {
val isTrue = b
}
implicit def BooleanFrom(b: BooleanW): Boolean = b.isTrue
}