-- | Wrapper types for using with @DerivingVia@.

module Generic.Data.Function.Via where

import GHC.Generics ( Generic )
import GHC.TypeLits ( ErrorMessage(Text) )
import Data.Functor.Identity ( Identity(..) )

-- | Wrapper for using to derive instances via generics. Emit type error on
--   'Rec0' base case i.e. any non-empty constructor.
newtype NoRec0 a = NoRec0 { forall a. NoRec0 a -> a
unNoRec0 :: a }
    deriving stock (forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (NoRec0 a) x -> NoRec0 a
forall a x. NoRec0 a -> Rep (NoRec0 a) x
$cto :: forall a x. Rep (NoRec0 a) x -> NoRec0 a
$cfrom :: forall a x. NoRec0 a -> Rep (NoRec0 a) x
Generic, Int -> NoRec0 a -> ShowS
forall a. Show a => Int -> NoRec0 a -> ShowS
forall a. Show a => [NoRec0 a] -> ShowS
forall a. Show a => NoRec0 a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [NoRec0 a] -> ShowS
$cshowList :: forall a. Show a => [NoRec0 a] -> ShowS
show :: NoRec0 a -> String
$cshow :: forall a. Show a => NoRec0 a -> String
showsPrec :: Int -> NoRec0 a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> NoRec0 a -> ShowS
Show)
    deriving (forall a b. a -> NoRec0 b -> NoRec0 a
forall a b. (a -> b) -> NoRec0 a -> NoRec0 b
forall (f :: Type -> Type).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> NoRec0 b -> NoRec0 a
$c<$ :: forall a b. a -> NoRec0 b -> NoRec0 a
fmap :: forall a b. (a -> b) -> NoRec0 a -> NoRec0 b
$cfmap :: forall a b. (a -> b) -> NoRec0 a -> NoRec0 b
Functor, Functor NoRec0
forall a. a -> NoRec0 a
forall a b. NoRec0 a -> NoRec0 b -> NoRec0 a
forall a b. NoRec0 a -> NoRec0 b -> NoRec0 b
forall a b. NoRec0 (a -> b) -> NoRec0 a -> NoRec0 b
forall a b c. (a -> b -> c) -> NoRec0 a -> NoRec0 b -> NoRec0 c
forall (f :: Type -> Type).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: forall a b. NoRec0 a -> NoRec0 b -> NoRec0 a
$c<* :: forall a b. NoRec0 a -> NoRec0 b -> NoRec0 a
*> :: forall a b. NoRec0 a -> NoRec0 b -> NoRec0 b
$c*> :: forall a b. NoRec0 a -> NoRec0 b -> NoRec0 b
liftA2 :: forall a b c. (a -> b -> c) -> NoRec0 a -> NoRec0 b -> NoRec0 c
$cliftA2 :: forall a b c. (a -> b -> c) -> NoRec0 a -> NoRec0 b -> NoRec0 c
<*> :: forall a b. NoRec0 (a -> b) -> NoRec0 a -> NoRec0 b
$c<*> :: forall a b. NoRec0 (a -> b) -> NoRec0 a -> NoRec0 b
pure :: forall a. a -> NoRec0 a
$cpure :: forall a. a -> NoRec0 a
Applicative, Applicative NoRec0
forall a. a -> NoRec0 a
forall a b. NoRec0 a -> NoRec0 b -> NoRec0 b
forall a b. NoRec0 a -> (a -> NoRec0 b) -> NoRec0 b
forall (m :: Type -> Type).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: forall a. a -> NoRec0 a
$creturn :: forall a. a -> NoRec0 a
>> :: forall a b. NoRec0 a -> NoRec0 b -> NoRec0 b
$c>> :: forall a b. NoRec0 a -> NoRec0 b -> NoRec0 b
>>= :: forall a b. NoRec0 a -> (a -> NoRec0 b) -> NoRec0 b
$c>>= :: forall a b. NoRec0 a -> (a -> NoRec0 b) -> NoRec0 b
Monad) via Identity

type ENoRec0 =
    'Text "Cannot use generic function on NoRec0-wrapped type containing fields"

-- | Wrapper for using to derive instances via generics. Do nothing for 'Rec0'
--   base case i.e. every constructor field.
--
-- "nothing" probably means 'mempty', but *may* be another unit-like.
--
-- TODO This might not be useful. It's not "special" like 'NoRec0', it's
-- basically tied to 'Monoid'. So it's useful for 'foldMap', but kind of
-- arbitrary when applied to 'traverse'.
newtype EmptyRec0 a = EmptyRec0 { forall a. EmptyRec0 a -> a
unEmptyRec0 :: a }
    deriving stock (forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (EmptyRec0 a) x -> EmptyRec0 a
forall a x. EmptyRec0 a -> Rep (EmptyRec0 a) x
$cto :: forall a x. Rep (EmptyRec0 a) x -> EmptyRec0 a
$cfrom :: forall a x. EmptyRec0 a -> Rep (EmptyRec0 a) x
Generic, Int -> EmptyRec0 a -> ShowS
forall a. Show a => Int -> EmptyRec0 a -> ShowS
forall a. Show a => [EmptyRec0 a] -> ShowS
forall a. Show a => EmptyRec0 a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EmptyRec0 a] -> ShowS
$cshowList :: forall a. Show a => [EmptyRec0 a] -> ShowS
show :: EmptyRec0 a -> String
$cshow :: forall a. Show a => EmptyRec0 a -> String
showsPrec :: Int -> EmptyRec0 a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> EmptyRec0 a -> ShowS
Show)
    deriving (forall a b. a -> EmptyRec0 b -> EmptyRec0 a
forall a b. (a -> b) -> EmptyRec0 a -> EmptyRec0 b
forall (f :: Type -> Type).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> EmptyRec0 b -> EmptyRec0 a
$c<$ :: forall a b. a -> EmptyRec0 b -> EmptyRec0 a
fmap :: forall a b. (a -> b) -> EmptyRec0 a -> EmptyRec0 b
$cfmap :: forall a b. (a -> b) -> EmptyRec0 a -> EmptyRec0 b
Functor, Functor EmptyRec0
forall a. a -> EmptyRec0 a
forall a b. EmptyRec0 a -> EmptyRec0 b -> EmptyRec0 a
forall a b. EmptyRec0 a -> EmptyRec0 b -> EmptyRec0 b
forall a b. EmptyRec0 (a -> b) -> EmptyRec0 a -> EmptyRec0 b
forall a b c.
(a -> b -> c) -> EmptyRec0 a -> EmptyRec0 b -> EmptyRec0 c
forall (f :: Type -> Type).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: forall a b. EmptyRec0 a -> EmptyRec0 b -> EmptyRec0 a
$c<* :: forall a b. EmptyRec0 a -> EmptyRec0 b -> EmptyRec0 a
*> :: forall a b. EmptyRec0 a -> EmptyRec0 b -> EmptyRec0 b
$c*> :: forall a b. EmptyRec0 a -> EmptyRec0 b -> EmptyRec0 b
liftA2 :: forall a b c.
(a -> b -> c) -> EmptyRec0 a -> EmptyRec0 b -> EmptyRec0 c
$cliftA2 :: forall a b c.
(a -> b -> c) -> EmptyRec0 a -> EmptyRec0 b -> EmptyRec0 c
<*> :: forall a b. EmptyRec0 (a -> b) -> EmptyRec0 a -> EmptyRec0 b
$c<*> :: forall a b. EmptyRec0 (a -> b) -> EmptyRec0 a -> EmptyRec0 b
pure :: forall a. a -> EmptyRec0 a
$cpure :: forall a. a -> EmptyRec0 a
Applicative, Applicative EmptyRec0
forall a. a -> EmptyRec0 a
forall a b. EmptyRec0 a -> EmptyRec0 b -> EmptyRec0 b
forall a b. EmptyRec0 a -> (a -> EmptyRec0 b) -> EmptyRec0 b
forall (m :: Type -> Type).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: forall a. a -> EmptyRec0 a
$creturn :: forall a. a -> EmptyRec0 a
>> :: forall a b. EmptyRec0 a -> EmptyRec0 b -> EmptyRec0 b
$c>> :: forall a b. EmptyRec0 a -> EmptyRec0 b -> EmptyRec0 b
>>= :: forall a b. EmptyRec0 a -> (a -> EmptyRec0 b) -> EmptyRec0 b
$c>>= :: forall a b. EmptyRec0 a -> (a -> EmptyRec0 b) -> EmptyRec0 b
Monad) via Identity