morley-prelude-0.6.0: A custom prelude used in Morley
Safe HaskellSafe-Inferred
LanguageHaskell2010

Morley.Prelude.Boolean

Description

This module replaces the monomorphic boolean operators from Prelude with a set of polymorphic operators.

Synopsis

Documentation

class Boolean a where Source #

Generalized boolean operators.

This is useful for defining things that behave like booleans, e.g. predicates, or EDSL for predicates.

>>> Yay && Nay
Nay
>>> and1 $ Yay :| replicate 9 Yay
Yay

There are also instances for these types lifted into IO and (->) a:

>>> (const Yay) && (const Nay) $ ()
Nay
>>> (const Yay) || (const Nay) $ ()
Yay

Methods

(&&) :: a -> a -> a infixr 3 Source #

(||) :: a -> a -> a infixr 2 Source #

not :: a -> a Source #

Instances

Instances details
Boolean Bool Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

(&&) :: Bool -> Bool -> Bool Source #

(||) :: Bool -> Bool -> Bool Source #

not :: Bool -> Bool Source #

Boolean bool => Boolean (IO bool) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

(&&) :: IO bool -> IO bool -> IO bool Source #

(||) :: IO bool -> IO bool -> IO bool Source #

not :: IO bool -> IO bool Source #

Boolean bool => Boolean (a -> bool) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

(&&) :: (a -> bool) -> (a -> bool) -> a -> bool Source #

(||) :: (a -> bool) -> (a -> bool) -> a -> bool Source #

not :: (a -> bool) -> a -> bool Source #

(Applicative f, Boolean bool) => Boolean (ApplicativeBoolean f bool) Source # 
Instance details

Defined in Morley.Prelude.Boolean

class Boolean a => BooleanMonoid a where Source #

Generalized True and False.

This is useful to complete the isomorphism between regular and generalized booleans. It's a separate class because not all boolean-like things form a monoid.

>>> or $ replicate 10 Nay
Nay

Minimal complete definition

true | false

Methods

false :: a Source #

true :: a Source #

Instances

Instances details
BooleanMonoid Bool Source # 
Instance details

Defined in Morley.Prelude.Boolean

BooleanMonoid bool => BooleanMonoid (IO bool) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

false :: IO bool Source #

true :: IO bool Source #

BooleanMonoid bool => BooleanMonoid (a -> bool) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

false :: a -> bool Source #

true :: a -> bool Source #

(Applicative f, BooleanMonoid bool) => BooleanMonoid (ApplicativeBoolean f bool) Source # 
Instance details

Defined in Morley.Prelude.Boolean

newtype ApplicativeBoolean f bool Source #

A newtype for deriving a Boolean instance for any Applicative type constructor using DerivingVia.

Constructors

ApplicativeBoolean (f bool) 

or :: (Container c, BooleanMonoid (Element c)) => c -> Element c Source #

Generalized version of or.

>>> or $ replicate 10 Nay
Nay
>>> or $ Yay : replicate 10 Nay
Yay

and :: (Container c, BooleanMonoid (Element c)) => c -> Element c Source #

Generalized version of and.

>>> and $ replicate 10 Yay
Yay
>>> and $ Nay : replicate 10 Yay
Nay

or1 :: Boolean a => NonEmpty a -> a Source #

A version of or that works on NonEmpty, thus doesn't require BooleanMonoid instance.

>>> or1 $ Yay :| [Nay]
Yay

and1 :: Boolean a => NonEmpty a -> a Source #

A version of and that works on NonEmpty, thus doesn't require BooleanMonoid instance.

>>> and1 $ Yay :| [Nay]
Nay

newtype Any a Source #

A generalized version of Any monoid wrapper.

>>> Any Nay <> Any Nay
Any {getAny = Nay}
>>> Any Yay <> Any Nay
Any {getAny = Yay}
>>> Any Yay <> Any Yay
Any {getAny = Yay}

Constructors

Any 

Fields

Instances

Instances details
Data a => Data (Any a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Any a -> c (Any a) #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Any a) #

toConstr :: Any a -> Constr #

dataTypeOf :: Any a -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Any a)) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Any a)) #

gmapT :: (forall b. Data b => b -> b) -> Any a -> Any a #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Any a -> r #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Any a -> r #

gmapQ :: (forall d. Data d => d -> u) -> Any a -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> Any a -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> Any a -> m (Any a) #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Any a -> m (Any a) #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Any a -> m (Any a) #

BooleanMonoid a => Monoid (Any a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

mempty :: Any a #

mappend :: Any a -> Any a -> Any a #

mconcat :: [Any a] -> Any a #

Boolean a => Semigroup (Any a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

(<>) :: Any a -> Any a -> Any a #

sconcat :: NonEmpty (Any a) -> Any a #

stimes :: Integral b => b -> Any a -> Any a #

Bounded a => Bounded (Any a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

minBound :: Any a #

maxBound :: Any a #

Enum a => Enum (Any a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

succ :: Any a -> Any a #

pred :: Any a -> Any a #

toEnum :: Int -> Any a #

fromEnum :: Any a -> Int #

enumFrom :: Any a -> [Any a] #

enumFromThen :: Any a -> Any a -> [Any a] #

enumFromTo :: Any a -> Any a -> [Any a] #

enumFromThenTo :: Any a -> Any a -> Any a -> [Any a] #

Generic (Any a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Associated Types

type Rep (Any a) :: Type -> Type #

Methods

from :: Any a -> Rep (Any a) x #

to :: Rep (Any a) x -> Any a #

Read a => Read (Any a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Show a => Show (Any a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

showsPrec :: Int -> Any a -> ShowS #

show :: Any a -> String #

showList :: [Any a] -> ShowS #

Eq a => Eq (Any a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

(==) :: Any a -> Any a -> Bool #

(/=) :: Any a -> Any a -> Bool #

Ord a => Ord (Any a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

compare :: Any a -> Any a -> Ordering #

(<) :: Any a -> Any a -> Bool #

(<=) :: Any a -> Any a -> Bool #

(>) :: Any a -> Any a -> Bool #

(>=) :: Any a -> Any a -> Bool #

max :: Any a -> Any a -> Any a #

min :: Any a -> Any a -> Any a #

type Rep (Any a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

type Rep (Any a) = D1 ('MetaData "Any" "Morley.Prelude.Boolean" "morley-prelude-0.6.0-inplace" 'True) (C1 ('MetaCons "Any" 'PrefixI 'True) (S1 ('MetaSel ('Just "getAny") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a)))

newtype All a Source #

A generalized version of All monoid wrapper.

>>> All Nay <> All Nay
All {getAll = Nay}
>>> All Yay <> All Nay
All {getAll = Nay}
>>> All Yay <> All Yay
All {getAll = Yay}

Constructors

All 

Fields

Instances

Instances details
Data a => Data (All a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> All a -> c (All a) #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (All a) #

toConstr :: All a -> Constr #

dataTypeOf :: All a -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (All a)) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (All a)) #

gmapT :: (forall b. Data b => b -> b) -> All a -> All a #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> All a -> r #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> All a -> r #

gmapQ :: (forall d. Data d => d -> u) -> All a -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> All a -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> All a -> m (All a) #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> All a -> m (All a) #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> All a -> m (All a) #

BooleanMonoid a => Monoid (All a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

mempty :: All a #

mappend :: All a -> All a -> All a #

mconcat :: [All a] -> All a #

Boolean a => Semigroup (All a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

(<>) :: All a -> All a -> All a #

sconcat :: NonEmpty (All a) -> All a #

stimes :: Integral b => b -> All a -> All a #

Bounded a => Bounded (All a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

minBound :: All a #

maxBound :: All a #

Enum a => Enum (All a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

succ :: All a -> All a #

pred :: All a -> All a #

toEnum :: Int -> All a #

fromEnum :: All a -> Int #

enumFrom :: All a -> [All a] #

enumFromThen :: All a -> All a -> [All a] #

enumFromTo :: All a -> All a -> [All a] #

enumFromThenTo :: All a -> All a -> All a -> [All a] #

Generic (All a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Associated Types

type Rep (All a) :: Type -> Type #

Methods

from :: All a -> Rep (All a) x #

to :: Rep (All a) x -> All a #

Read a => Read (All a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Show a => Show (All a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

showsPrec :: Int -> All a -> ShowS #

show :: All a -> String #

showList :: [All a] -> ShowS #

Eq a => Eq (All a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

(==) :: All a -> All a -> Bool #

(/=) :: All a -> All a -> Bool #

Ord a => Ord (All a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

Methods

compare :: All a -> All a -> Ordering #

(<) :: All a -> All a -> Bool #

(<=) :: All a -> All a -> Bool #

(>) :: All a -> All a -> Bool #

(>=) :: All a -> All a -> Bool #

max :: All a -> All a -> All a #

min :: All a -> All a -> All a #

type Rep (All a) Source # 
Instance details

Defined in Morley.Prelude.Boolean

type Rep (All a) = D1 ('MetaData "All" "Morley.Prelude.Boolean" "morley-prelude-0.6.0-inplace" 'True) (C1 ('MetaCons "All" 'PrefixI 'True) (S1 ('MetaSel ('Just "getAll") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a)))

any :: (Container c, BooleanMonoid b) => (Element c -> b) -> c -> b Source #

Generalized any.

>>> any (\x -> if x > 50 then Yay else Nay) [1..100]
Yay

all :: (Container c, BooleanMonoid b) => (Element c -> b) -> c -> b Source #

Generalized all.

>>> all (\x -> if x > 50 then Yay else Nay) [1..100]
Nay

any1 :: Boolean b => (a -> b) -> NonEmpty a -> b Source #

A version of any that works on NonEmpty, thus doesn't require BooleanMonoid instance.

>>> any1 (\x -> if x > 50 then Yay else Nay) $ 50 :| replicate 10 0
Nay

all1 :: Boolean b => (a -> b) -> NonEmpty a -> b Source #

A version of all that works on NonEmpty, thus doesn't require BooleanMonoid instance.

>>> all1 (\x -> if x > 50 then Yay else Nay) $ 100 :| replicate 10 51
Yay

Example definitions

>>> :{
data Vote = Yay | Nay deriving Show
--
instance Boolean Vote where
  Yay && Yay = Yay
  _ && _ = Nay
  Nay || Nay = Nay
  _ || _ = Yay
  not Yay = Nay
  not Nay = Yay
--
instance BooleanMonoid Vote where
  true = Yay
  false = Nay
:}