{-# LANGUAGE
CPP,
FlexibleContexts,
TypeFamilies,
UndecidableInstances,
UndecidableSuperClasses #-}
{-# OPTIONS_GHC -Wno-noncanonical-monoid-instances #-}
#if __GLASGOW_HASKELL__ >= 904
{-# OPTIONS_GHC -Wno-orphans #-}
#endif
module Generic.Data.Internal.Generically
( Generically(..)
, Generically1(..)
, FiniteEnumeration(..)
, GenericProduct(..) ) where
import GHC.Generics
import Data.Functor.Classes
import Data.Ix
import Text.Read
import Generic.Data.Internal.Prelude hiding (gfoldMap, gtraverse, gsequenceA)
import Generic.Data.Internal.Enum
import Generic.Data.Internal.Error
import Generic.Data.Internal.Read
import Generic.Data.Internal.Show
import Generic.Data.Internal.Traversable (GFoldable, GTraversable, gfoldMap, gtraverse, gsequenceA)
#if __GLASGOW_HASKELL__ < 904
import Control.Applicative
import Data.Semigroup
#endif
#if __GLASGOW_HASKELL__ < 904
newtype Generically a = Generically a
instance (AssertNoSum Semigroup a, Generic a, Semigroup (Rep a ())) => Semigroup (Generically a) where
<> :: Generically a -> Generically a -> Generically a
(<>) = forall a. (Generic a, Semigroup (Rep a ())) => a -> a -> a
gmappend
instance (AssertNoSum Semigroup a, Semigroup a, Generic a, Monoid (Rep a ())) => Monoid (Generically a) where
mempty :: Generically a
mempty = forall a. (Generic a, Monoid (Rep a ())) => a
gmempty
mappend :: Generically a -> Generically a -> Generically a
mappend (Generically a
x) (Generically a
y) = forall a. a -> Generically a
Generically (a
x forall a. Semigroup a => a -> a -> a
<> a
y)
#endif
instance Generic a => Generic (Generically a) where
type Rep (Generically a) = Rep a
to :: forall x. Rep (Generically a) x -> Generically a
to = forall a. a -> Generically a
Generically forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => Rep a x -> a
to
from :: forall x. Generically a -> Rep (Generically a) x
from (Generically a
x) = forall a x. Generic a => a -> Rep a x
from a
x
instance (Generic a, Eq (Rep a ())) => Eq (Generically a) where
== :: Generically a -> Generically a -> Bool
(==) = forall a. (Generic a, Eq (Rep a ())) => a -> a -> Bool
geq
instance (Generic a, Ord (Rep a ())) => Ord (Generically a) where
compare :: Generically a -> Generically a -> Ordering
compare = forall a. (Generic a, Ord (Rep a ())) => a -> a -> Ordering
gcompare
instance (Generic a, GRead0 (Rep a)) => Read (Generically a) where
readPrec :: ReadPrec (Generically a)
readPrec = forall a. (Generic a, GRead0 (Rep a)) => ReadPrec a
greadPrec
readListPrec :: ReadPrec [Generically a]
readListPrec = forall a. Read a => ReadPrec [a]
readListPrecDefault
instance (Generic a, GShow0 (Rep a)) => Show (Generically a) where
showsPrec :: Int -> Generically a -> ShowS
showsPrec = forall a. (Generic a, GShow0 (Rep a)) => Int -> a -> ShowS
gshowsPrec
instance (Generic a, GEnum StandardEnum (Rep a)) => Enum (Generically a) where
toEnum :: Int -> Generically a
toEnum = forall a. (Generic a, GEnum StandardEnum (Rep a)) => Int -> a
gtoEnum
fromEnum :: Generically a -> Int
fromEnum = forall a. (Generic a, GEnum StandardEnum (Rep a)) => a -> Int
gfromEnum
enumFrom :: Generically a -> [Generically a]
enumFrom = forall a. (Generic a, GEnum StandardEnum (Rep a)) => a -> [a]
genumFrom
enumFromThen :: Generically a -> Generically a -> [Generically a]
enumFromThen = forall a. (Generic a, GEnum StandardEnum (Rep a)) => a -> a -> [a]
genumFromThen
enumFromTo :: Generically a -> Generically a -> [Generically a]
enumFromTo = forall a. (Generic a, GEnum StandardEnum (Rep a)) => a -> a -> [a]
genumFromTo
enumFromThenTo :: Generically a -> Generically a -> Generically a -> [Generically a]
enumFromThenTo = forall a.
(Generic a, GEnum StandardEnum (Rep a)) =>
a -> a -> a -> [a]
genumFromThenTo
instance (Generic a, Ord (Rep a ()), GIx (Rep a)) => Ix (Generically a) where
range :: (Generically a, Generically a) -> [Generically a]
range = forall a. (Generic a, GIx (Rep a)) => (a, a) -> [a]
grange
index :: (Generically a, Generically a) -> Generically a -> Int
index = forall a. (Generic a, GIx (Rep a)) => (a, a) -> a -> Int
gindex
inRange :: (Generically a, Generically a) -> Generically a -> Bool
inRange = forall a. (Generic a, GIx (Rep a)) => (a, a) -> a -> Bool
ginRange
instance (Generic a, GBounded (Rep a)) => Bounded (Generically a) where
minBound :: Generically a
minBound = forall a. (Generic a, GBounded (Rep a)) => a
gminBound
maxBound :: Generically a
maxBound = forall a. (Generic a, GBounded (Rep a)) => a
gmaxBound
newtype FiniteEnumeration a = FiniteEnumeration a
instance Generic a => Generic (FiniteEnumeration a) where
type Rep (FiniteEnumeration a) = Rep a
to :: forall x. Rep (FiniteEnumeration a) x -> FiniteEnumeration a
to = forall a. a -> FiniteEnumeration a
FiniteEnumeration forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => Rep a x -> a
to
from :: forall x. FiniteEnumeration a -> Rep (FiniteEnumeration a) x
from (FiniteEnumeration a
x) = forall a x. Generic a => a -> Rep a x
from a
x
instance (Generic a, GEnum FiniteEnum (Rep a)) => Enum (FiniteEnumeration a) where
toEnum :: Int -> FiniteEnumeration a
toEnum = forall a. (Generic a, GEnum FiniteEnum (Rep a)) => Int -> a
gtoFiniteEnum
fromEnum :: FiniteEnumeration a -> Int
fromEnum = forall a. (Generic a, GEnum FiniteEnum (Rep a)) => a -> Int
gfromFiniteEnum
enumFrom :: FiniteEnumeration a -> [FiniteEnumeration a]
enumFrom = forall a. (Generic a, GEnum FiniteEnum (Rep a)) => a -> [a]
gfiniteEnumFrom
enumFromThen :: FiniteEnumeration a -> FiniteEnumeration a -> [FiniteEnumeration a]
enumFromThen = forall a. (Generic a, GEnum FiniteEnum (Rep a)) => a -> a -> [a]
gfiniteEnumFromThen
enumFromTo :: FiniteEnumeration a -> FiniteEnumeration a -> [FiniteEnumeration a]
enumFromTo = forall a. (Generic a, GEnum FiniteEnum (Rep a)) => a -> a -> [a]
gfiniteEnumFromTo
enumFromThenTo :: FiniteEnumeration a
-> FiniteEnumeration a
-> FiniteEnumeration a
-> [FiniteEnumeration a]
enumFromThenTo = forall a.
(Generic a, GEnum FiniteEnum (Rep a)) =>
a -> a -> a -> [a]
gfiniteEnumFromThenTo
instance (Generic a, GBounded (Rep a)) => Bounded (FiniteEnumeration a) where
minBound :: FiniteEnumeration a
minBound = forall a. (Generic a, GBounded (Rep a)) => a
gminBound
maxBound :: FiniteEnumeration a
maxBound = forall a. (Generic a, GBounded (Rep a)) => a
gmaxBound
#if __GLASGOW_HASKELL__ < 904
newtype Generically1 f a = Generically1 (f a)
instance (Generic1 f, Eq1 (Rep1 f)) => Eq1 (Generically1 f) where
liftEq :: forall a b.
(a -> b -> Bool) -> Generically1 f a -> Generically1 f b -> Bool
liftEq = forall (f :: * -> *) a b.
(Generic1 f, Eq1 (Rep1 f)) =>
(a -> b -> Bool) -> f a -> f b -> Bool
gliftEq
instance (Generic1 f, Ord1 (Rep1 f)) => Ord1 (Generically1 f) where
liftCompare :: forall a b.
(a -> b -> Ordering)
-> Generically1 f a -> Generically1 f b -> Ordering
liftCompare = forall (f :: * -> *) a b.
(Generic1 f, Ord1 (Rep1 f)) =>
(a -> b -> Ordering) -> f a -> f b -> Ordering
gliftCompare
instance (Generic1 f, Functor (Rep1 f)) => Functor (Generically1 f) where
fmap :: forall a b. (a -> b) -> Generically1 f a -> Generically1 f b
fmap = forall (f :: * -> *) a b.
(Generic1 f, Functor (Rep1 f)) =>
(a -> b) -> f a -> f b
gfmap
<$ :: forall a b. a -> Generically1 f b -> Generically1 f a
(<$) = forall (f :: * -> *) a b.
(Generic1 f, Functor (Rep1 f)) =>
a -> f b -> f a
gconstmap
instance (Generic1 f, Applicative (Rep1 f)) => Applicative (Generically1 f) where
pure :: forall a. a -> Generically1 f a
pure = forall (f :: * -> *) a.
(Generic1 f, Applicative (Rep1 f)) =>
a -> f a
gpure
<*> :: forall a b.
Generically1 f (a -> b) -> Generically1 f a -> Generically1 f b
(<*>) = forall (f :: * -> *) a b.
(Generic1 f, Applicative (Rep1 f)) =>
f (a -> b) -> f a -> f b
gap
#if MIN_VERSION_base(4,10,0)
liftA2 :: forall a b c.
(a -> b -> c)
-> Generically1 f a -> Generically1 f b -> Generically1 f c
liftA2 = forall (f :: * -> *) a b c.
(Generic1 f, Applicative (Rep1 f)) =>
(a -> b -> c) -> f a -> f b -> f c
gliftA2
#endif
instance (Generic1 f, Alternative (Rep1 f)) => Alternative (Generically1 f) where
empty :: forall a. Generically1 f a
empty = forall (f :: * -> *) a. (Generic1 f, Alternative (Rep1 f)) => f a
gempty
<|> :: forall a. Generically1 f a -> Generically1 f a -> Generically1 f a
(<|>) = forall (f :: * -> *) a.
(Generic1 f, Alternative (Rep1 f)) =>
f a -> f a -> f a
galt
instance (Generic1 f, Eq1 (Rep1 f), Eq a) => Eq (Generically1 f a) where
== :: Generically1 f a -> Generically1 f a -> Bool
(==) = forall (f :: * -> *) a. (Eq1 f, Eq a) => f a -> f a -> Bool
eq1
instance (Generic1 f, Ord1 (Rep1 f), Ord a) => Ord (Generically1 f a) where
compare :: Generically1 f a -> Generically1 f a -> Ordering
compare = forall (f :: * -> *) a. (Ord1 f, Ord a) => f a -> f a -> Ordering
compare1
#endif
instance Generic (f a) => Generic (Generically1 f a) where
type Rep (Generically1 f a) = Rep (f a)
to :: forall x. Rep (Generically1 f a) x -> Generically1 f a
to = forall (f :: * -> *) a. f a -> Generically1 f a
Generically1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => Rep a x -> a
to
from :: forall x. Generically1 f a -> Rep (Generically1 f a) x
from (Generically1 f a
x) = forall a x. Generic a => a -> Rep a x
from f a
x
instance Generic1 f => Generic1 (Generically1 f) where
type Rep1 (Generically1 f) = Rep1 f
to1 :: forall a. Rep1 (Generically1 f) a -> Generically1 f a
to1 = forall (f :: * -> *) a. f a -> Generically1 f a
Generically1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k (f :: k -> *) (a :: k). Generic1 f => Rep1 f a -> f a
to1
from1 :: forall a. Generically1 f a -> Rep1 (Generically1 f) a
from1 (Generically1 f a
x) = forall k (f :: k -> *) (a :: k). Generic1 f => f a -> Rep1 f a
from1 f a
x
instance (Generic1 f, GRead1 (Rep1 f)) => Read1 (Generically1 f) where
#if MIN_VERSION_base(4,10,0)
liftReadPrec :: forall a. ReadPrec a -> ReadPrec [a] -> ReadPrec (Generically1 f a)
liftReadPrec = forall (f :: * -> *) a.
(Generic1 f, GRead1 (Rep1 f)) =>
ReadPrec a -> ReadPrec [a] -> ReadPrec (f a)
gliftReadPrec
liftReadListPrec :: forall a. ReadPrec a -> ReadPrec [a] -> ReadPrec [Generically1 f a]
liftReadListPrec = forall (f :: * -> *) a.
Read1 f =>
ReadPrec a -> ReadPrec [a] -> ReadPrec [f a]
liftReadListPrecDefault
#else
liftReadsPrec rp rl = readPrec_to_S $
gliftReadPrec (readS_to_Prec rp) (readS_to_Prec (const rl))
#endif
instance (Generic1 f, GRead1 (Rep1 f), Read a) => Read (Generically1 f a) where
#if MIN_VERSION_base(4,10,0)
readPrec :: ReadPrec (Generically1 f a)
readPrec = forall (f :: * -> *) a. (Read1 f, Read a) => ReadPrec (f a)
readPrec1
readListPrec :: ReadPrec [Generically1 f a]
readListPrec = forall a. Read a => ReadPrec [a]
readListPrecDefault
#else
readsPrec = readsPrec1
#endif
instance (Generic1 f, GShow1 (Rep1 f)) => Show1 (Generically1 f) where
liftShowsPrec :: forall a.
(Int -> a -> ShowS)
-> ([a] -> ShowS) -> Int -> Generically1 f a -> ShowS
liftShowsPrec = forall (f :: * -> *) a.
(Generic1 f, GShow1 (Rep1 f)) =>
(Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> f a -> ShowS
gliftShowsPrec
instance (Generic1 f, GShow1 (Rep1 f), Show a) => Show (Generically1 f a) where
showsPrec :: Int -> Generically1 f a -> ShowS
showsPrec = forall (f :: * -> *) a. (Show1 f, Show a) => Int -> f a -> ShowS
showsPrec1
instance (Generic1 f, GFoldable (Rep1 f)) => Foldable (Generically1 f) where
foldMap :: forall m a. Monoid m => (a -> m) -> Generically1 f a -> m
foldMap = forall (f :: * -> *) m a.
(Generic1 f, GFoldable (Rep1 f), Monoid m) =>
(a -> m) -> f a -> m
gfoldMap
foldr :: forall a b. (a -> b -> b) -> b -> Generically1 f a -> b
foldr = forall (f :: * -> *) a b.
(Generic1 f, Foldable (Rep1 f)) =>
(a -> b -> b) -> b -> f a -> b
gfoldr
instance (Generic1 f, Functor (Rep1 f), GFoldable (Rep1 f), GTraversable (Rep1 f))
=> Traversable (Generically1 f) where
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Generically1 f a -> f (Generically1 f b)
traverse = forall (f :: * -> *) (m :: * -> *) a b.
(Generic1 f, GTraversable (Rep1 f), Applicative m) =>
(a -> m b) -> f a -> m (f b)
gtraverse
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
Generically1 f (f a) -> f (Generically1 f a)
sequenceA = forall (f :: * -> *) (m :: * -> *) a.
(Generic1 f, GTraversable (Rep1 f), Applicative m) =>
f (m a) -> m (f a)
gsequenceA
newtype GenericProduct a = GenericProduct a
instance Generic a => Generic (GenericProduct a) where
type Rep (GenericProduct a) = Rep a
to :: forall x. Rep (GenericProduct a) x -> GenericProduct a
to = forall a. a -> GenericProduct a
GenericProduct forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => Rep a x -> a
to
from :: forall x. GenericProduct a -> Rep (GenericProduct a) x
from (GenericProduct a
x) = forall a x. Generic a => a -> Rep a x
from a
x
instance (AssertNoSum Semigroup a, Generic a, Semigroup (Rep a ())) => Semigroup (GenericProduct a) where
<> :: GenericProduct a -> GenericProduct a -> GenericProduct a
(<>) = forall a. (Generic a, Semigroup (Rep a ())) => a -> a -> a
gmappend
instance (AssertNoSum Semigroup a, Generic a, Monoid (Rep a ())) => Monoid (GenericProduct a) where
mempty :: GenericProduct a
mempty = forall a. (Generic a, Monoid (Rep a ())) => a
gmempty
mappend :: GenericProduct a -> GenericProduct a -> GenericProduct a
mappend = forall a. (Generic a, Monoid (Rep a ())) => a -> a -> a
gmappend'