packages feed

generic-data-functions-0.5.0: src/Generic/Data/Function/Contra/NonSum.hs

{-# LANGUAGE UndecidableInstances #-} -- due to type class design
{-# LANGUAGE AllowAmbiguousTypes  #-} -- due to type class design

module Generic.Data.Function.Contra.NonSum where

import Data.Functor.Contravariant
import Data.Functor.Contravariant.Divisible

import GHC.Generics
import Generic.Data.Function.Contra.Constructor
import Generic.Data.Function.Common.Error
import Generic.Data.Function.Common.Generic

class GContraNonSum tag gf where gContraNonSum :: GenericContraF tag (gf p)

instance (Contravariant (GenericContraF tag), GContraNonSumD tag gf)
  => GContraNonSum tag (C1 c gf) where
    gContraNonSum = contramap unM1 (gContraNonSumD @tag)

class GContraNonSumD tag gf where gContraNonSumD :: GenericContraF tag (gf p)

instance (Contravariant (GenericContraF tag), GContraC tag gf)
  => GContraNonSumD tag (C1 c gf) where
    gContraNonSumD = contramap unM1 (gContraC @tag)

instance GContraNonSumD tag (l :+: r) where gContraNonSumD = error eNoSum

instance Divisible (GenericContraF tag) => GContraNonSumD tag V1 where
    gContraNonSumD = contramap absurdV1 conquer