{-# OPTIONS_GHC -Wno-orphans #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Data.Wrapped.Default (GDefault(..)) where
import GHC.Generics
( Generic(..), M1(..), (:+:)(..), (:*:)(..), U1(..), K1(..)
)
import Data.Default.Class (Default(..))
import Data.Wrapped (Wrapped(..))
class GDefault f where
gdef :: f x
instance GDefault f => GDefault (M1 i m f) where
gdef :: M1 i m f x
gdef = f x -> M1 i m f x
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 f x
forall (f :: * -> *) x. GDefault f => f x
gdef
instance GDefault f => GDefault (f :+: g) where
gdef :: (:+:) f g x
gdef = f x -> (:+:) f g x
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1 f x
forall (f :: * -> *) x. GDefault f => f x
gdef
instance (GDefault f, GDefault g) => GDefault (f :*: g) where
gdef :: (:*:) f g x
gdef = f x
forall (f :: * -> *) x. GDefault f => f x
gdef f x -> g x -> (:*:) f g x
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
:*: g x
forall (f :: * -> *) x. GDefault f => f x
gdef
instance GDefault U1 where
gdef :: U1 x
gdef = U1 x
forall k (p :: k). U1 p
U1
instance Default a => GDefault (K1 i a) where
gdef :: K1 i a x
gdef = a -> K1 i a x
forall k i c (p :: k). c -> K1 i c p
K1 a
forall a. Default a => a
def
instance (Generic a, GDefault (Rep a)) => Default (Wrapped Generic a) where
def :: Wrapped Generic a
def = a -> Wrapped Generic a
forall (c :: * -> Constraint) a. a -> Wrapped c a
Wrapped (a -> Wrapped Generic a) -> a -> Wrapped Generic a
forall a b. (a -> b) -> a -> b
$ Rep a Any -> a
forall a x. Generic a => Rep a x -> a
to Rep a Any
forall (f :: * -> *) x. GDefault f => f x
gdef