{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE DerivingStrategies #-}
module Data.Act.Cyclic
(
LActCyclic (..)
, lorigin
, RActCyclic (..)
, rorigin
, LActGen (..)
, lgenerators
, lgeneratorsList
, lorigins
, RActGen (..)
, rgenerators
, rgeneratorsList
, rorigins
)
where
import Data.Bifunctor
import Data.Functor.Identity
import Data.Coerce
import Data.Semigroup as Sg
import Data.Monoid as Mn
import Data.Default
import Data.Act.Act
class LAct x s => LActCyclic x s where
lorigin' :: x
lshift :: x -> s
lorigin :: forall s x. LActCyclic x s => x
lorigin :: forall s x. LActCyclic x s => x
lorigin = forall x s. LActCyclic x s => x
lorigin' @x @s
{-# INLINE lorigin #-}
class RAct x s => RActCyclic x s where
rorigin' :: x
rshift :: x -> s
rorigin :: forall s x. RActCyclic x s => x
rorigin :: forall s x. RActCyclic x s => x
rorigin = forall x s. RActCyclic x s => x
rorigin' @x @s
{-# INLINE rorigin #-}
class LAct x s => LActGen x s where
lgenerators' :: x -> Bool
default lgenerators' :: Eq x => x -> Bool
lgenerators' x
x = x
x x -> [x] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` forall x s. LActGen x s => [x]
lgeneratorsList' @x @s
lgeneratorsList' :: [x]
default lgeneratorsList' :: LActCyclic x s => [x]
lgeneratorsList' = [forall s x. LActCyclic x s => x
lorigin @s]
lshiftFromGen:: x -> (x,s)
default lshiftFromGen :: LActCyclic x s => x -> (x,s)
lshiftFromGen x
x = (forall s x. LActCyclic x s => x
lorigin @s, x -> s
forall x s. LActCyclic x s => x -> s
lshift x
x)
lgenerators :: forall s x. LActGen x s => x -> Bool
lgenerators :: forall s x. LActGen x s => x -> Bool
lgenerators = forall x s. LActGen x s => x -> Bool
lgenerators' @x @s
{-# INLINE lgenerators #-}
lgeneratorsList :: forall s x. LActGen x s => [x]
lgeneratorsList :: forall s x. LActGen x s => [x]
lgeneratorsList = forall x s. LActGen x s => [x]
lgeneratorsList' @x @s
{-# INLINE lgeneratorsList #-}
lorigins :: forall s x. LActGen x s => [x]
lorigins :: forall s x. LActGen x s => [x]
lorigins = forall s x. LActGen x s => [x]
lgeneratorsList @s
{-# INLINE lorigins #-}
class RAct x s => RActGen x s where
rgenerators' :: x -> Bool
default rgenerators' :: Eq x => x -> Bool
rgenerators' x
x = x
x x -> [x] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` forall x s. RActGen x s => [x]
rgeneratorsList' @x @s
{-# INLINE rgenerators' #-}
rgeneratorsList' :: [x]
default rgeneratorsList' :: RActCyclic x s => [x]
rgeneratorsList' = [forall s x. RActCyclic x s => x
rorigin @s]
{-# INLINE rgeneratorsList' #-}
rshiftFromGen :: x -> (x,s)
default rshiftFromGen :: RActCyclic x s => x -> (x,s)
rshiftFromGen x
x = (forall s x. RActCyclic x s => x
rorigin @s, x -> s
forall x s. RActCyclic x s => x -> s
rshift x
x)
{-# INLINE rshiftFromGen #-}
rgenerators :: forall s x. RActGen x s => x -> Bool
rgenerators :: forall s x. RActGen x s => x -> Bool
rgenerators = forall x s. RActGen x s => x -> Bool
rgenerators' @x @s
{-# INLINE rgenerators #-}
rgeneratorsList :: forall s x. RActGen x s => [x]
rgeneratorsList :: forall s x. RActGen x s => [x]
rgeneratorsList = forall x s. RActGen x s => [x]
rgeneratorsList' @x @s
{-# INLINE rgeneratorsList #-}
rorigins :: forall s x. RActGen x s => [x]
rorigins :: forall s x. RActGen x s => [x]
rorigins = forall s x. RActGen x s => [x]
rgeneratorsList @s
{-# INLINE rorigins #-}
instance LActGen x s => LActGen (Identity x) (Identity s) where
lgenerators' :: Identity x -> Bool
lgenerators' (Identity x
x) = forall s x. LActGen x s => x -> Bool
lgenerators @s x
x
{-# INLINE lgenerators' #-}
lgeneratorsList' :: [Identity x]
lgeneratorsList' = x -> Identity x
forall a. a -> Identity a
Identity (x -> Identity x) -> [x] -> [Identity x]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s x. LActGen x s => [x]
lgeneratorsList @s
{-# INLINE lgeneratorsList' #-}
lshiftFromGen :: Identity x -> (Identity x, Identity s)
lshiftFromGen (Identity x
x) = (x -> Identity x)
-> (s -> Identity s) -> (x, s) -> (Identity x, Identity s)
forall a b c d. (a -> b) -> (c -> d) -> (a, c) -> (b, d)
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap x -> Identity x
forall a. a -> Identity a
Identity s -> Identity s
forall a. a -> Identity a
Identity ((x, s) -> (Identity x, Identity s))
-> (x, s) -> (Identity x, Identity s)
forall a b. (a -> b) -> a -> b
$ x -> (x, s)
forall x s. LActGen x s => x -> (x, s)
lshiftFromGen x
x
{-# INLINE lshiftFromGen #-}
instance LActCyclic x s => LActCyclic (Identity x) (Identity s) where
lorigin' :: Identity x
lorigin' = x -> Identity x
forall a. a -> Identity a
Identity (forall s x. LActCyclic x s => x
lorigin @s)
{-# INLINE lorigin' #-}
lshift :: Identity x -> Identity s
lshift (Identity x
x) = s -> Identity s
forall a. a -> Identity a
Identity (x -> s
forall x s. LActCyclic x s => x -> s
lshift x
x)
{-# INLINE lshift #-}
instance RActGen x s => RActGen (Identity x) (Identity s) where
rgenerators' :: Identity x -> Bool
rgenerators' (Identity x
x) = forall s x. RActGen x s => x -> Bool
rgenerators @s x
x
{-# INLINE rgenerators' #-}
rgeneratorsList' :: [Identity x]
rgeneratorsList' = x -> Identity x
forall a. a -> Identity a
Identity (x -> Identity x) -> [x] -> [Identity x]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s x. RActGen x s => [x]
rgeneratorsList @s
{-# INLINE rgeneratorsList' #-}
rshiftFromGen :: Identity x -> (Identity x, Identity s)
rshiftFromGen (Identity x
x) = (x -> Identity x)
-> (s -> Identity s) -> (x, s) -> (Identity x, Identity s)
forall a b c d. (a -> b) -> (c -> d) -> (a, c) -> (b, d)
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap x -> Identity x
forall a. a -> Identity a
Identity s -> Identity s
forall a. a -> Identity a
Identity ((x, s) -> (Identity x, Identity s))
-> (x, s) -> (Identity x, Identity s)
forall a b. (a -> b) -> a -> b
$ x -> (x, s)
forall x s. RActGen x s => x -> (x, s)
rshiftFromGen x
x
{-# INLINE rshiftFromGen #-}
instance RActCyclic x s => RActCyclic (Identity x) (Identity s) where
rorigin' :: Identity x
rorigin' = x -> Identity x
forall a. a -> Identity a
Identity (forall s x. RActCyclic x s => x
rorigin @s)
{-# INLINE rorigin' #-}
rshift :: Identity x -> Identity s
rshift (Identity x
x) = s -> Identity s
forall a. a -> Identity a
Identity (x -> s
forall x s. RActCyclic x s => x -> s
rshift x
x)
{-# INLINE rshift #-}
instance (Eq s, Monoid s) => LActGen s (ActSelf s)
instance Monoid s => LActCyclic s (ActSelf s) where
lorigin' :: s
lorigin' = s
forall s. Monoid s => s
mempty
{-# INLINE lorigin' #-}
lshift :: s -> ActSelf s
lshift = s -> ActSelf s
forall s. s -> ActSelf s
ActSelf
{-# INLINE lshift #-}
instance (Eq s, Monoid s) => RActGen s (ActSelf s)
instance Monoid s => RActCyclic s (ActSelf s) where
rorigin' :: s
rorigin' = s
forall s. Monoid s => s
mempty
{-# INLINE rorigin' #-}
rshift :: s -> ActSelf s
rshift = s -> ActSelf s
forall s. s -> ActSelf s
ActSelf
{-# INLINE rshift #-}
instance (Eq x, Coercible x s, Monoid s) => LActGen x (ActSelf' s)
instance (Coercible x s, Monoid s) => LActCyclic x (ActSelf' s) where
lorigin' :: x
lorigin' = s -> x
forall a b. Coercible a b => a -> b
coerce (s
forall s. Monoid s => s
mempty :: s)
{-# INLINE lorigin' #-}
lshift :: x -> ActSelf' s
lshift = x -> ActSelf' s
forall a b. Coercible a b => a -> b
coerce
{-# INLINE lshift #-}
instance (Eq x, Coercible x s, Monoid s) => RActGen x (ActSelf' s)
instance (Coercible x s, Monoid s) => RActCyclic x (ActSelf' s) where
rorigin' :: x
rorigin' = s -> x
forall a b. Coercible a b => a -> b
coerce (s
forall s. Monoid s => s
mempty :: s)
{-# INLINE rorigin' #-}
rshift :: x -> ActSelf' s
rshift = x -> ActSelf' s
forall a b. Coercible a b => a -> b
coerce
{-# INLINE rshift #-}
instance (Eq x, Num x) => LActGen x (Sum x)
instance Num x => LActCyclic x (Sum x) where
lorigin' :: x
lorigin' = x
0
{-# INLINE lorigin' #-}
lshift :: x -> Sum x
lshift = x -> Sum x
forall a. a -> Sum a
Sum
{-# INLINE lshift #-}
instance (Eq x, Num x) => RActGen x (Sum x)
instance Num x => RActCyclic x (Sum x) where
rorigin' :: x
rorigin' = x
0
{-# INLINE rorigin' #-}
rshift :: x -> Sum x
rshift = x -> Sum x
forall a. a -> Sum a
Sum
{-# INLINE rshift #-}
instance (Eq x, Num x) => LActGen x (Product x)
instance Num x => LActCyclic x (Product x) where
lorigin' :: x
lorigin' = x
1
{-# INLINE lorigin' #-}
lshift :: x -> Product x
lshift = x -> Product x
forall a. a -> Product a
Product
{-# INLINE lshift #-}
instance (Eq x, Num x) => RActGen x (Product x)
instance Num x => RActCyclic x (Product x) where
rorigin' :: x
rorigin' = x
1
{-# INLINE rorigin' #-}
rshift :: x -> Product x
rshift = x -> Product x
forall a. a -> Product a
Product
{-# INLINE rshift #-}
instance (Eq x, Num x) => LActGen (Sum x) (Product x)
instance Num x => LActCyclic (Sum x) (Product x) where
lorigin' :: Sum x
lorigin' = Sum x
1
{-# INLINE lorigin' #-}
lshift :: Sum x -> Product x
lshift = Sum x -> Product x
forall a b. Coercible a b => a -> b
coerce
{-# INLINE lshift #-}
instance (Eq x, Num x) => RActGen (Sum x) (Product x)
instance Num x => RActCyclic (Sum x) (Product x) where
rorigin' :: Sum x
rorigin' = Sum x
1
{-# INLINE rorigin' #-}
rshift :: Sum x -> Product x
rshift = Sum x -> Product x
forall a b. Coercible a b => a -> b
coerce
{-# INLINE rshift #-}
instance Default x => LActCyclic x (Sg.First x) where
lorigin' :: x
lorigin' = x
forall x. Default x => x
def
lshift :: x -> First x
lshift = x -> First x
forall a. a -> First a
Sg.First
instance Default x => LActCyclic x (Mn.First x) where
lorigin' :: x
lorigin' = x
forall x. Default x => x
def
lshift :: x -> First x
lshift = Maybe x -> First x
forall a. Maybe a -> First a
Mn.First (Maybe x -> First x) -> (x -> Maybe x) -> x -> First x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. x -> Maybe x
forall a. a -> Maybe a
Just
instance Default x => RActCyclic x (Sg.Last x) where
rorigin' :: x
rorigin' = x
forall x. Default x => x
def
rshift :: x -> Last x
rshift = x -> Last x
forall a. a -> Last a
Sg.Last
instance Default x => RActCyclic x (Mn.Last x) where
rorigin' :: x
rorigin' = x
forall x. Default x => x
def
rshift :: x -> Last x
rshift = Maybe x -> Last x
forall a. Maybe a -> Last a
Mn.Last (Maybe x -> Last x) -> (x -> Maybe x) -> x -> Last x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. x -> Maybe x
forall a. a -> Maybe a
Just