{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ >= 701
{-# LANGUAGE DefaultSignatures #-}
# if __GLASGOW_HASKELL__ >= 704
{-# LANGUAGE Safe #-}
# else
{-# LANGUAGE Trustworthy #-}
# endif
#endif
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-}
module Generics.Deriving.Default
(
Default(..)
,
Default1(..)
) where
#if !(MIN_VERSION_base(4,8,0))
import Control.Applicative ((<$>))
#endif
import Control.Monad (liftM)
import Generics.Deriving.Base
import Generics.Deriving.Copoint
import Generics.Deriving.Enum
import Generics.Deriving.Eq
import Generics.Deriving.Foldable
import Generics.Deriving.Functor
import Generics.Deriving.Monoid
import Generics.Deriving.Semigroup
import Generics.Deriving.Show
import Generics.Deriving.Traversable
import Generics.Deriving.Uniplate
newtype Default a = Default { Default a -> a
unDefault :: a }
newtype Default1 f a = Default1 { Default1 f a -> f a
unDefault1 :: f a }
instance (Generic a, GEq' (Rep a)) => GEq (Default a) where
Default a
x geq :: Default a -> Default a -> Bool
`geq` Default a
y = a
x a -> a -> Bool
forall a. (Generic a, GEq' (Rep a)) => a -> a -> Bool
`geqdefault` a
y
instance (Generic a, GEq a, Enum' (Rep a)) => GEnum (Default a) where
genum :: [Default a]
genum = a -> Default a
forall a. a -> Default a
Default (a -> Default a) -> (Rep a Any -> a) -> Rep a Any -> Default a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rep a Any -> a
forall a x. Generic a => Rep a x -> a
to (Rep a Any -> Default a) -> [Rep a Any] -> [Default a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Rep a Any]
forall k (f :: k -> *) (a :: k). Enum' f => [f a]
enum'
instance (Generic a, GShow' (Rep a)) => GShow (Default a) where
gshowsPrec :: Int -> Default a -> ShowS
gshowsPrec Int
n (Default a
x) = Int -> a -> ShowS
forall a. (Generic a, GShow' (Rep a)) => Int -> a -> ShowS
gshowsPrecdefault Int
n a
x
instance (Generic a, GSemigroup' (Rep a)) => GSemigroup (Default a) where
Default a
x gsappend :: Default a -> Default a -> Default a
`gsappend` Default a
y = a -> Default a
forall a. a -> Default a
Default (a -> Default a) -> a -> Default a
forall a b. (a -> b) -> a -> b
$ a
x a -> a -> a
forall a. (Generic a, GSemigroup' (Rep a)) => a -> a -> a
`gsappenddefault` a
y
instance (Generic a, GMonoid' (Rep a)) => GMonoid (Default a) where
gmempty :: Default a
gmempty = a -> Default a
forall a. a -> Default a
Default a
forall a. (Generic a, GMonoid' (Rep a)) => a
gmemptydefault
Default a
x gmappend :: Default a -> Default a -> Default a
`gmappend` Default a
y = a -> Default a
forall a. a -> Default a
Default (a -> Default a) -> a -> Default a
forall a b. (a -> b) -> a -> b
$ a
x a -> a -> a
forall a. (Generic a, GMonoid' (Rep a)) => a -> a -> a
`gmappenddefault` a
y
instance (Generic a, Uniplate' (Rep a) a, Context' (Rep a) a) => Uniplate (Default a) where
children :: Default a -> [Default a]
children (Default a
x) = a -> Default a
forall a. a -> Default a
Default (a -> Default a) -> [a] -> [Default a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> [a]
forall a. (Generic a, Uniplate' (Rep a) a) => a -> [a]
childrendefault a
x
context :: Default a -> [Default a] -> Default a
context (Default a
x) [Default a]
ys = a -> Default a
forall a. a -> Default a
Default (a -> Default a) -> a -> Default a
forall a b. (a -> b) -> a -> b
$ a -> [a] -> a
forall a. (Generic a, Context' (Rep a) a) => a -> [a] -> a
contextdefault a
x (Default a -> a
forall a. Default a -> a
unDefault (Default a -> a) -> [Default a] -> [a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Default a]
ys)
descend :: (Default a -> Default a) -> Default a -> Default a
descend Default a -> Default a
f (Default a
x) = a -> Default a
forall a. a -> Default a
Default (a -> Default a) -> a -> Default a
forall a b. (a -> b) -> a -> b
$ (a -> a) -> a -> a
forall a. (Generic a, Uniplate' (Rep a) a) => (a -> a) -> a -> a
descenddefault (Default a -> a
forall a. Default a -> a
unDefault (Default a -> a) -> (a -> Default a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Default a -> Default a
f (Default a -> Default a) -> (a -> Default a) -> a -> Default a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Default a
forall a. a -> Default a
Default) a
x
descendM :: (Default a -> m (Default a)) -> Default a -> m (Default a)
descendM Default a -> m (Default a)
f (Default a
x) = (a -> Default a) -> m a -> m (Default a)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM a -> Default a
forall a. a -> Default a
Default (m a -> m (Default a)) -> m a -> m (Default a)
forall a b. (a -> b) -> a -> b
$ (a -> m a) -> a -> m a
forall a (m :: * -> *).
(Generic a, Uniplate' (Rep a) a, Monad m) =>
(a -> m a) -> a -> m a
descendMdefault ((Default a -> a) -> m (Default a) -> m a
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Default a -> a
forall a. Default a -> a
unDefault (m (Default a) -> m a) -> (a -> m (Default a)) -> a -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Default a -> m (Default a)
f (Default a -> m (Default a))
-> (a -> Default a) -> a -> m (Default a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Default a
forall a. a -> Default a
Default) a
x
transform :: (Default a -> Default a) -> Default a -> Default a
transform Default a -> Default a
f (Default a
x) = a -> Default a
forall a. a -> Default a
Default (a -> Default a) -> a -> Default a
forall a b. (a -> b) -> a -> b
$ (a -> a) -> a -> a
forall a. (Generic a, Uniplate' (Rep a) a) => (a -> a) -> a -> a
transformdefault (Default a -> a
forall a. Default a -> a
unDefault (Default a -> a) -> (a -> Default a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Default a -> Default a
f (Default a -> Default a) -> (a -> Default a) -> a -> Default a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Default a
forall a. a -> Default a
Default) a
x
transformM :: (Default a -> m (Default a)) -> Default a -> m (Default a)
transformM Default a -> m (Default a)
f (Default a
x) = (a -> Default a) -> m a -> m (Default a)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM a -> Default a
forall a. a -> Default a
Default (m a -> m (Default a)) -> m a -> m (Default a)
forall a b. (a -> b) -> a -> b
$ (a -> m a) -> a -> m a
forall a (m :: * -> *).
(Generic a, Uniplate' (Rep a) a, Monad m) =>
(a -> m a) -> a -> m a
transformMdefault ((Default a -> a) -> m (Default a) -> m a
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Default a -> a
forall a. Default a -> a
unDefault (m (Default a) -> m a) -> (a -> m (Default a)) -> a -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Default a -> m (Default a)
f (Default a -> m (Default a))
-> (a -> Default a) -> a -> m (Default a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Default a
forall a. a -> Default a
Default) a
x
instance (Generic1 f, GFunctor' (Rep1 f)) => GFunctor (Default1 f) where
gmap :: (a -> b) -> Default1 f a -> Default1 f b
gmap a -> b
f (Default1 f a
fx) = f b -> Default1 f b
forall (f :: * -> *) a. f a -> Default1 f a
Default1 (f b -> Default1 f b) -> f b -> Default1 f b
forall a b. (a -> b) -> a -> b
$ (a -> b) -> f a -> f b
forall (f :: * -> *) a b.
(Generic1 f, GFunctor' (Rep1 f)) =>
(a -> b) -> f a -> f b
gmapdefault a -> b
f f a
fx
instance (Generic1 f, GCopoint' (Rep1 f)) => GCopoint (Default1 f) where
gcopoint :: Default1 f a -> a
gcopoint = f a -> a
forall (d :: * -> *) a.
(Generic1 d, GCopoint' (Rep1 d)) =>
d a -> a
gcopointdefault (f a -> a) -> (Default1 f a -> f a) -> Default1 f a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Default1 f a -> f a
forall (f :: * -> *) a. Default1 f a -> f a
unDefault1
instance (Generic1 t, GFoldable' (Rep1 t)) => GFoldable (Default1 t) where
gfoldMap :: (a -> m) -> Default1 t a -> m
gfoldMap a -> m
f (Default1 t a
tx) = (a -> m) -> t a -> m
forall (t :: * -> *) m a.
(Generic1 t, GFoldable' (Rep1 t), Monoid m) =>
(a -> m) -> t a -> m
gfoldMapdefault a -> m
f t a
tx
instance (Generic1 t, GFunctor' (Rep1 t), GFoldable' (Rep1 t), GTraversable' (Rep1 t)) => GTraversable (Default1 t) where
gtraverse :: (a -> f b) -> Default1 t a -> f (Default1 t b)
gtraverse a -> f b
f (Default1 t a
fx) = t b -> Default1 t b
forall (f :: * -> *) a. f a -> Default1 f a
Default1 (t b -> Default1 t b) -> f (t b) -> f (Default1 t b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> f b) -> t a -> f (t b)
forall (t :: * -> *) (f :: * -> *) a b.
(Generic1 t, GTraversable' (Rep1 t), Applicative f) =>
(a -> f b) -> t a -> f (t b)
gtraversedefault a -> f b
f t a
fx