{-# LANGUAGE FlexibleInstances, Trustworthy #-}
{-# LANGUAGE GeneralizedNewtypeDeriving, PatternSynonyms, LambdaCase #-}
{-# OPTIONS_HADDOCK hide #-}
module Math.Tools.Endomorphism where
import qualified Data.Monoid as Mon
import Math.Tools.Isomorphism
import Math.Tools.Universe
newtype Endo a = EndoI { forall a. Endo a -> Endo a
unEndo :: Mon.Endo a }
deriving (NonEmpty (Endo a) -> Endo a
Endo a -> Endo a -> Endo a
(Endo a -> Endo a -> Endo a)
-> (NonEmpty (Endo a) -> Endo a)
-> (forall b. Integral b => b -> Endo a -> Endo a)
-> Semigroup (Endo a)
forall b. Integral b => b -> Endo a -> Endo a
forall a. NonEmpty (Endo a) -> Endo a
forall a. Endo a -> Endo a -> Endo a
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
forall a b. Integral b => b -> Endo a -> Endo a
$c<> :: forall a. Endo a -> Endo a -> Endo a
<> :: Endo a -> Endo a -> Endo a
$csconcat :: forall a. NonEmpty (Endo a) -> Endo a
sconcat :: NonEmpty (Endo a) -> Endo a
$cstimes :: forall a b. Integral b => b -> Endo a -> Endo a
stimes :: forall b. Integral b => b -> Endo a -> Endo a
Semigroup, Semigroup (Endo a)
Endo a
Semigroup (Endo a) =>
Endo a
-> (Endo a -> Endo a -> Endo a)
-> ([Endo a] -> Endo a)
-> Monoid (Endo a)
[Endo a] -> Endo a
Endo a -> Endo a -> Endo a
forall a. Semigroup (Endo a)
forall a. Endo a
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
forall a. [Endo a] -> Endo a
forall a. Endo a -> Endo a -> Endo a
$cmempty :: forall a. Endo a
mempty :: Endo a
$cmappend :: forall a. Endo a -> Endo a -> Endo a
mappend :: Endo a -> Endo a -> Endo a
$cmconcat :: forall a. [Endo a] -> Endo a
mconcat :: [Endo a] -> Endo a
Monoid)
pattern $mEndo :: forall {r} {a}. Endo a -> ((a -> a) -> r) -> ((# #) -> r) -> r
$bEndo :: forall {a}. (a -> a) -> Endo a
Endo f = EndoI (Mon.Endo f)
class (Monoid x) => GraphAction x where
source :: x
target :: x
isSource :: x -> Bool
isTarget :: x -> Bool
isIdentity :: x -> Bool
class (GraphAction x) => ReversibleGraphAction x where
invert :: x
isInvert :: x -> Bool
instance GraphAction () where
source :: ()
source = ()
target :: ()
target = ()
isSource :: () -> Bool
isSource ()
_ = Bool
True
isTarget :: () -> Bool
isTarget ()
_ = Bool
True
isIdentity :: () -> Bool
isIdentity ()
_ = Bool
True
instance GraphAction (Endo Bool) where
isIdentity :: Endo Bool -> Bool
isIdentity = Endo Bool -> Bool
forall a. (Universe a, Eq a) => Endo a -> Bool
isIdentityE
source :: Endo Bool
source = Endo Bool
falseE
isSource :: Endo Bool -> Bool
isSource = Endo Bool -> Bool
isFalseE
target :: Endo Bool
target = Endo Bool
trueE
isTarget :: Endo Bool -> Bool
isTarget = Endo Bool -> Bool
isTrueE
instance GraphAction Ordering where
source :: Ordering
source = Ordering
LT
target :: Ordering
target = Ordering
GT
isIdentity :: Ordering -> Bool
isIdentity Ordering
x = Ordering
x Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
EQ
isSource :: Ordering -> Bool
isSource Ordering
x = Ordering
x Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
LT
isTarget :: Ordering -> Bool
isTarget Ordering
x = Ordering
x Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT
instance ReversibleGraphAction (Endo Bool) where
invert :: Endo Bool
invert = Endo Bool
notE
isInvert :: Endo Bool -> Bool
isInvert = Endo Bool -> Bool
isNotE
instance (Universe a, Eq a) => Eq (Endo a) where
(Endo a -> a
f) == :: Endo a -> Endo a -> Bool
== (Endo a -> a
g) = [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and [a -> a
f a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a -> a
g a
x | a
x <- [a]
forall a. Universe a => [a]
allElements]
instance (Show a, Universe a) => Show (Endo a) where
show :: Endo a -> String
show (Endo a -> a
f) = [(a, a)] -> String
forall a. Show a => a -> String
show [(a
x,a -> a
f a
x) | a
x <- [a]
forall a. Universe a => [a]
allElements]
inverse_image_endo :: (a -> a) -> Endo a -> Endo a
inverse_image_endo :: forall a. (a -> a) -> Endo a -> Endo a
inverse_image_endo a -> a
f (Endo a -> a
g) = (a -> a) -> Endo a
forall {a}. (a -> a) -> Endo a
Endo (a -> a
g (a -> a) -> (a -> a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a
f)
isoMapEndo :: Iso a b -> Endo a -> Endo b
isoMapEndo :: forall a b. Iso a b -> Endo a -> Endo b
isoMapEndo Iso a b
i (Endo a -> a
f) = (b -> b) -> Endo b
forall {a}. (a -> a) -> Endo a
Endo (Iso a b -> a -> b
forall a b. (a :==: b) -> a -> b
isomorphismEpimorphism Iso a b
i (a -> b) -> (b -> a) -> b -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a
f (a -> a) -> (b -> a) -> b -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Iso a b -> b -> a
forall a b. (a :==: b) -> b -> a
isomorphismSection Iso a b
i)
identityE :: Endo a
identityE :: forall a. Endo a
identityE = (a -> a) -> Endo a
forall {a}. (a -> a) -> Endo a
Endo a -> a
forall a. a -> a
id
isIdentityE :: (Universe a, Eq a) => Endo a -> Bool
isIdentityE :: forall a. (Universe a, Eq a) => Endo a -> Bool
isIdentityE (Endo a -> a
f) = [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and [a -> a
f a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
x | a
x <- [a]
forall a. Universe a => [a]
allElements]
notE :: Endo Bool
notE :: Endo Bool
notE = (Bool -> Bool) -> Endo Bool
forall {a}. (a -> a) -> Endo a
Endo Bool -> Bool
not
isNotE :: Endo Bool -> Bool
isNotE :: Endo Bool -> Bool
isNotE (Endo Bool -> Bool
f) = Bool -> Bool
f Bool
True Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
False Bool -> Bool -> Bool
&& Bool -> Bool
f Bool
False Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
True
trueE :: Endo Bool
trueE :: Endo Bool
trueE = (Bool -> Bool) -> Endo Bool
forall {a}. (a -> a) -> Endo a
Endo (Bool -> Bool -> Bool
forall a b. a -> b -> a
const Bool
True)
isTrueE :: Endo Bool -> Bool
isTrueE :: Endo Bool -> Bool
isTrueE (Endo Bool -> Bool
f) = Bool -> Bool
f Bool
True Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
True Bool -> Bool -> Bool
&& Bool -> Bool
f Bool
False Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
True
falseE :: Endo Bool
falseE :: Endo Bool
falseE = (Bool -> Bool) -> Endo Bool
forall {a}. (a -> a) -> Endo a
Endo (Bool -> Bool -> Bool
forall a b. a -> b -> a
const Bool
False)
isFalseE :: Endo Bool -> Bool
isFalseE :: Endo Bool -> Bool
isFalseE (Endo Bool -> Bool
f) = Bool -> Bool
f Bool
True Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
False Bool -> Bool -> Bool
&& Bool -> Bool
f Bool
False Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
False
threeT :: (Ordering,Ordering,Ordering) -> Endo Ordering
threeT :: (Ordering, Ordering, Ordering) -> Endo Ordering
threeT (Ordering
f,Ordering
g,Ordering
h) = (Ordering -> Ordering) -> Endo Ordering
forall {a}. (a -> a) -> Endo a
Endo ((Ordering -> Ordering) -> Endo Ordering)
-> (Ordering -> Ordering) -> Endo Ordering
forall a b. (a -> b) -> a -> b
$ \case
Ordering
LT -> Ordering
f
Ordering
EQ -> Ordering
g
Ordering
GT -> Ordering
h