-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Generalized booleans
--
-- Some classes for generalized boolean operations.
--
-- Copyright 2009 Conal Elliott; BSD3 license.
@package Boolean
@version 0.0.1
-- | Some classes for generalized boolean operations.
--
-- In this design, for if-then-else, equality and inequality tests, the
-- boolean type depends functionally on the value type. This dependency
-- allows the boolean type to be inferred in a conditional expression.
--
-- I also tried using a unary type constructor class. The class doesn't
-- work for regular booleans, so generality is lost. Also, we'd probably
-- have to wire class constraints in like: (==*) :: Eq a => f Bool
-- -> f a -> f a -> f a, which disallows situations needing
-- additional constraints, e.g., Show.
module Data.Boolean
-- | Generalized boolean class
class Boolean b
true, false :: Boolean b => b
notB :: Boolean b => b -> b
(&&*, ||*) :: Boolean b => b -> b -> b
-- | Types with conditionals
class Boolean bool => IfB bool a | a -> bool
ifB :: IfB bool a => bool -> a -> a -> a
-- | Expression-lifted conditional with condition last
boolean :: IfB bool a => a -> a -> bool -> a
-- | Point-wise conditional
cond :: (Applicative f, IfB bool a) => f bool -> f a -> f a -> f a
-- | Crop a function, filling in mempty where the test yeis false.
crop :: (Applicative f, Monoid (f a), IfB bool a) => f bool -> f a -> f a
-- | Types with equality. Minimum definition: '(==*)'.
class Boolean bool => EqB bool a | a -> bool where u /=* v = notB (u ==* v)
(==*, /=*) :: EqB bool a => a -> a -> bool
-- | Types with inequality. Minimum definition: '(<*)'.
class Boolean bool => OrdB bool a | a -> bool where u >* v = v <* u u >=* v = notB (u <* v) u <=* v = v >=* u
(<*, >=*, >*, <=*) :: OrdB bool a => a -> a -> bool
-- | Variant of min using ifB and '(<=*)'
minB :: (IfB bool a, OrdB bool a) => a -> a -> a
-- | Variant of max using ifB and '(>=*)'
maxB :: (IfB bool a, OrdB bool a) => a -> a -> a
instance OrdB bool a => OrdB (z -> bool) (z -> a)
instance EqB bool a => EqB (z -> bool) (z -> a)
instance IfB bool a => IfB (z -> bool) (z -> a)
instance Boolean bool => Boolean (z -> bool)
instance (IfB bool p, IfB bool q, IfB bool r, IfB bool s) => IfB bool (p, q, r, s)
instance (IfB bool p, IfB bool q, IfB bool r) => IfB bool (p, q, r)
instance (IfB bool p, IfB bool q) => IfB bool (p, q)
instance OrdB Bool Float
instance EqB Bool Float
instance IfB Bool Float
instance Boolean Bool