{-# language StandaloneKindSignatures #-}
{-# language TypeFamilies #-}

module Rel8.Generic.Reify
  ( ARep
  )
where

-- base
import Data.Functor.Contravariant ( Contravariant, contramap )
import Data.Kind ( Type )
import Data.Void ( Void, absurd )
import GHC.Generics ( Generic, Rep, from, to )
import Prelude


type ARep :: (Type -> Type) -> Type
newtype ARep rep = ARep (rep Void)


instance (Contravariant rep, Functor rep) => Generic (ARep rep) where
  type Rep (ARep rep) = rep
  from :: ARep rep -> Rep (ARep rep) x
from (ARep rep Void
a) = (Void -> x) -> rep Void -> rep x
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Void -> x
forall a. Void -> a
absurd rep Void
a
  to :: Rep (ARep rep) x -> ARep rep
to = rep Void -> ARep rep
forall (rep :: * -> *). rep Void -> ARep rep
ARep (rep Void -> ARep rep) -> (rep x -> rep Void) -> rep x -> ARep rep
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Void -> x) -> rep x -> rep Void
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
contramap Void -> x
forall a. Void -> a
absurd