{-# LANGUAGE CPP               #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE GADTs             #-}
{-# LANGUAGE Trustworthy       #-}
{-# LANGUAGE TypeOperators     #-}
{-# LANGUAGE EmptyCase         #-}
module Data.Boring (
    
    Boring (..),
    Absurd (..),
    
    GBoring,
    GAbsurd,
    
    vacuous,
    devoid,
    united,
) where
import Prelude (Either (..), Functor (..), Maybe (..), const, (.))
import Control.Applicative   (Const (..), (<$))
import Data.Functor.Compose  (Compose (..))
import Data.Functor.Identity (Identity (..))
import Data.Functor.Product  (Product (..))
import Data.Functor.Sum      (Sum (..))
import Data.List.NonEmpty    (NonEmpty (..))
import Data.Proxy            (Proxy (..))
import GHC.Generics
       (Generic (..), K1 (..), M1 (..), Par1 (..), Rec1 (..), U1 (..), V1,
       (:*:) (..), (:+:) (..), (:.:) (..))
import qualified Data.Void as V
import qualified Data.Coerce        as Co
import qualified Data.Type.Coercion as Co
import qualified Data.Type.Equality as Eq
import qualified Type.Reflection as Typeable
#if MIN_VERSION_base(4,18,0)
import qualified GHC.TypeLits as TypeLits
import qualified GHC.TypeNats as TypeNats
#endif
#ifdef MIN_VERSION_tagged
import Data.Tagged (Tagged (..))
#endif
class Boring a where
    boring :: a
    default boring :: (Generic a, GBoring (Rep a)) => a
    boring = Rep a Any -> a
forall a x. Generic a => Rep a x -> a
forall x. Rep a x -> a
to Rep a Any
forall a. Rep a a
forall (f :: * -> *) a. GBoring f => f a
gboring
instance Boring () where
    boring :: ()
boring = ()
instance Boring b => Boring (a -> b) where
    boring :: a -> b
boring = b -> a -> b
forall a b. a -> b -> a
const b
forall a. Boring a => a
boring
instance Boring (Proxy a) where
    boring :: Proxy a
boring = Proxy a
forall {k} (t :: k). Proxy t
Proxy
instance Boring a => Boring (Const a b) where
    boring :: Const a b
boring = a -> Const a b
forall {k} a (b :: k). a -> Const a b
Const a
forall a. Boring a => a
boring
#ifdef MIN_VERSION_tagged
instance Boring b => Boring (Tagged a b) where
    boring :: Tagged a b
boring = b -> Tagged a b
forall {k} (s :: k) b. b -> Tagged s b
Tagged b
forall a. Boring a => a
boring
#endif
instance Boring a => Boring (Identity a) where
    boring :: Identity a
boring = a -> Identity a
forall a. a -> Identity a
Identity a
forall a. Boring a => a
boring
instance Boring (f (g a)) => Boring (Compose f g a) where
    boring :: Compose f g a
boring = f (g a) -> Compose f g a
forall {k} {k1} (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose f (g a)
forall a. Boring a => a
boring
instance (Boring (f a), Boring (g a)) => Boring (Product f g a) where
    boring :: Product f g a
boring = f a -> g a -> Product f g a
forall {k} (f :: k -> *) (g :: k -> *) (a :: k).
f a -> g a -> Product f g a
Pair f a
forall a. Boring a => a
boring g a
forall a. Boring a => a
boring
instance (Boring a, Boring b) => Boring (a, b) where
    boring :: (a, b)
boring = (a
forall a. Boring a => a
boring, b
forall a. Boring a => a
boring)
instance (Boring a, Boring b, Boring c) => Boring (a, b, c) where
    boring :: (a, b, c)
boring = (a
forall a. Boring a => a
boring, b
forall a. Boring a => a
boring, c
forall a. Boring a => a
boring)
instance (Boring a, Boring b, Boring c, Boring d) => Boring (a, b, c, d) where
    boring :: (a, b, c, d)
boring = (a
forall a. Boring a => a
boring, b
forall a. Boring a => a
boring, c
forall a. Boring a => a
boring, d
forall a. Boring a => a
boring)
instance (Boring a, Boring b, Boring c, Boring d, Boring e) => Boring (a, b, c, d, e) where
    boring :: (a, b, c, d, e)
boring = (a
forall a. Boring a => a
boring, b
forall a. Boring a => a
boring, c
forall a. Boring a => a
boring, d
forall a. Boring a => a
boring, e
forall a. Boring a => a
boring)
instance Absurd a => Boring [a] where
    boring :: [a]
boring = []
instance Absurd a => Boring (Maybe a) where
    boring :: Maybe a
boring = Maybe a
forall a. Maybe a
Nothing
instance Co.Coercible a b => Boring (Co.Coercion a b) where
    boring :: Coercion a b
boring = Coercion a b
forall {k} (a :: k) (b :: k). Coercible a b => Coercion a b
Co.Coercion
instance a ~ b => Boring (a Eq.:~: b) where
    boring :: a :~: b
boring = a :~: a
a :~: b
forall {k} (a :: k). a :~: a
Eq.Refl
instance a Eq.~~ b => Boring (a Eq.:~~: b) where
    boring :: a :~~: b
boring = a :~~: a
a :~~: b
forall {k1} (a :: k1). a :~~: a
Eq.HRefl
instance Typeable.Typeable a => Boring (Typeable.TypeRep a) where
    boring :: TypeRep a
boring = TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
Typeable.typeRep
#if MIN_VERSION_base(4,18,0)
instance TypeLits.KnownChar n => Boring (TypeLits.SChar n) where
    boring :: SChar n
boring = SChar n
forall (n :: Char). KnownChar n => SChar n
TypeLits.charSing
instance TypeLits.KnownSymbol n => Boring (TypeLits.SSymbol n) where
    boring :: SSymbol n
boring = SSymbol n
forall (n :: Symbol). KnownSymbol n => SSymbol n
TypeLits.symbolSing
instance TypeNats.KnownNat n => Boring (TypeNats.SNat n) where
    boring :: SNat n
boring = SNat n
forall (n :: Nat). KnownNat n => SNat n
TypeNats.natSing
#endif
instance Boring (U1 p) where
    boring :: U1 p
boring = U1 p
forall k (p :: k). U1 p
U1
instance Boring c => Boring (K1 i c p) where
    boring :: K1 i c p
boring = c -> K1 i c p
forall k i c (p :: k). c -> K1 i c p
K1 c
forall a. Boring a => a
boring
instance Boring (f p) => Boring (M1 i c f p) where
    boring :: M1 i c f p
boring = f p -> M1 i c f p
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 f p
forall a. Boring a => a
boring
instance (Boring (f p), Boring (g p)) => Boring ((f :*: g) p) where
    boring :: (:*:) f g p
boring = f p
forall a. Boring a => a
boring f p -> g p -> (:*:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
:*: g p
forall a. Boring a => a
boring
instance Boring p => Boring (Par1 p) where
    boring :: Par1 p
boring = p -> Par1 p
forall p. p -> Par1 p
Par1 p
forall a. Boring a => a
boring
instance Boring (f p) => Boring (Rec1 f p) where
    boring :: Rec1 f p
boring = f p -> Rec1 f p
forall k (f :: k -> *) (p :: k). f p -> Rec1 f p
Rec1 f p
forall a. Boring a => a
boring
instance Boring (f (g p)) => Boring ((f :.: g) p) where
    boring :: (:.:) f g p
boring = f (g p) -> (:.:) f g p
forall k2 k1 (f :: k2 -> *) (g :: k1 -> k2) (p :: k1).
f (g p) -> (:.:) f g p
Comp1 f (g p)
forall a. Boring a => a
boring
class Absurd a where
    absurd :: a -> b
    default absurd :: (Generic a, GAbsurd (Rep a)) => a -> b
    absurd = Rep a Any -> b
forall a b. Rep a a -> b
forall (f :: * -> *) a b. GAbsurd f => f a -> b
gabsurd (Rep a Any -> b) -> (a -> Rep a Any) -> a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Rep a Any
forall x. a -> Rep a x
forall a x. Generic a => a -> Rep a x
from
instance Absurd V.Void where
    absurd :: forall b. Void -> b
absurd = Void -> b
forall b. Void -> b
V.absurd
instance (Absurd a, Absurd b) => Absurd (Either a b) where
    absurd :: forall b. Either a b -> b
absurd (Left a
a) = a -> b
forall b. a -> b
forall a b. Absurd a => a -> b
absurd a
a
    absurd (Right b
b) = b -> b
forall b. b -> b
forall a b. Absurd a => a -> b
absurd b
b
instance Absurd a => Absurd (NonEmpty a) where
    absurd :: forall b. NonEmpty a -> b
absurd (a
x :| [a]
_) = a -> b
forall b. a -> b
forall a b. Absurd a => a -> b
absurd a
x
instance Absurd a => Absurd (Identity a) where
    absurd :: forall b. Identity a -> b
absurd = a -> b
forall b. a -> b
forall a b. Absurd a => a -> b
absurd (a -> b) -> (Identity a -> a) -> Identity a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Identity a -> a
forall a. Identity a -> a
runIdentity
instance Absurd (f (g a)) => Absurd (Compose f g a) where
    absurd :: forall b. Compose f g a -> b
absurd = f (g a) -> b
forall b. f (g a) -> b
forall a b. Absurd a => a -> b
absurd (f (g a) -> b) -> (Compose f g a -> f (g a)) -> Compose f g a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Compose f g a -> f (g a)
forall {k1} {k2} (f :: k1 -> *) (g :: k2 -> k1) (a :: k2).
Compose f g a -> f (g a)
getCompose
instance (Absurd (f a), Absurd (g a)) => Absurd (Sum f g a) where
    absurd :: forall b. Sum f g a -> b
absurd (InL f a
fa) = f a -> b
forall b. f a -> b
forall a b. Absurd a => a -> b
absurd f a
fa
    absurd (InR g a
ga) = g a -> b
forall b. g a -> b
forall a b. Absurd a => a -> b
absurd g a
ga
instance Absurd b => Absurd (Const b a) where
    absurd :: forall b. Const b a -> b
absurd = b -> b
forall b. b -> b
forall a b. Absurd a => a -> b
absurd (b -> b) -> (Const b a -> b) -> Const b a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Const b a -> b
forall {k} a (b :: k). Const a b -> a
getConst
#ifdef MIN_VERSION_tagged
instance Absurd a => Absurd (Tagged b a) where
    absurd :: forall b. Tagged b a -> b
absurd = a -> b
forall b. a -> b
forall a b. Absurd a => a -> b
absurd (a -> b) -> (Tagged b a -> a) -> Tagged b a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Tagged b a -> a
forall {k} (s :: k) b. Tagged s b -> b
unTagged
#endif
instance Absurd (V1 p) where
    absurd :: forall b. V1 p -> b
absurd V1 p
v = case V1 p
v of {}
instance Absurd c => Absurd (K1 i c p) where
    absurd :: forall b. K1 i c p -> b
absurd = c -> b
forall b. c -> b
forall a b. Absurd a => a -> b
absurd (c -> b) -> (K1 i c p -> c) -> K1 i c p -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. K1 i c p -> c
forall k i c (p :: k). K1 i c p -> c
unK1
instance Absurd (f p) => Absurd (M1 i c f p) where
    absurd :: forall b. M1 i c f p -> b
absurd = f p -> b
forall b. f p -> b
forall a b. Absurd a => a -> b
absurd (f p -> b) -> (M1 i c f p -> f p) -> M1 i c f p -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. M1 i c f p -> f p
forall k i (c :: Meta) (f :: k -> *) (p :: k). M1 i c f p -> f p
unM1
instance (Absurd (f p), Absurd (g p)) => Absurd ((f :+: g) p) where
    absurd :: forall b. (:+:) f g p -> b
absurd (L1 f p
a) = f p -> b
forall b. f p -> b
forall a b. Absurd a => a -> b
absurd f p
a
    absurd (R1 g p
b) = g p -> b
forall b. g p -> b
forall a b. Absurd a => a -> b
absurd g p
b
instance Absurd p => Absurd (Par1 p) where
    absurd :: forall b. Par1 p -> b
absurd = p -> b
forall b. p -> b
forall a b. Absurd a => a -> b
absurd (p -> b) -> (Par1 p -> p) -> Par1 p -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Par1 p -> p
forall p. Par1 p -> p
unPar1
instance Absurd (f p) => Absurd (Rec1 f p) where
    absurd :: forall b. Rec1 f p -> b
absurd = f p -> b
forall b. f p -> b
forall a b. Absurd a => a -> b
absurd (f p -> b) -> (Rec1 f p -> f p) -> Rec1 f p -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rec1 f p -> f p
forall k (f :: k -> *) (p :: k). Rec1 f p -> f p
unRec1
instance Absurd (f (g p)) => Absurd ((f :.: g) p) where
    absurd :: forall b. (:.:) f g p -> b
absurd = f (g p) -> b
forall b. f (g p) -> b
forall a b. Absurd a => a -> b
absurd (f (g p) -> b) -> ((:.:) f g p -> f (g p)) -> (:.:) f g p -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:.:) f g p -> f (g p)
forall k2 k1 (f :: k2 -> *) (g :: k1 -> k2) (p :: k1).
(:.:) f g p -> f (g p)
unComp1
vacuous :: (Functor f, Absurd a) => f a -> f b
vacuous :: forall (f :: * -> *) a b. (Functor f, Absurd a) => f a -> f b
vacuous = (a -> b) -> f a -> f b
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
forall b. a -> b
forall a b. Absurd a => a -> b
absurd
devoid :: Absurd s => p a (f b) -> s -> f s
devoid :: forall s (p :: * -> * -> *) a (f :: * -> *) b.
Absurd s =>
p a (f b) -> s -> f s
devoid p a (f b)
_ = s -> f s
forall b. s -> b
forall a b. Absurd a => a -> b
absurd
united :: (Boring a, Functor f) => (a -> f a) -> s -> f s
united :: forall a (f :: * -> *) s.
(Boring a, Functor f) =>
(a -> f a) -> s -> f s
united a -> f a
f s
v = s
v s -> f a -> f s
forall a b. a -> f b -> f a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ a -> f a
f a
forall a. Boring a => a
boring
class GBoring f where
    gboring :: f a
instance GBoring U1 where
    gboring :: forall p. U1 p
gboring = U1 a
forall k (p :: k). U1 p
U1
instance GBoring f => GBoring (M1 i c f) where
    gboring :: forall a. M1 i c f a
gboring = f a -> M1 i c f a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 f a
forall a. f a
forall (f :: * -> *) a. GBoring f => f a
gboring
instance (GBoring f, GBoring g) => GBoring (f :*: g) where
    gboring :: forall a. (:*:) f g a
gboring = f a
forall a. f a
forall (f :: * -> *) a. GBoring f => f a
gboring f a -> g a -> (:*:) f g a
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
:*: g a
forall a. g a
forall (f :: * -> *) a. GBoring f => f a
gboring
instance Boring c => GBoring (K1 i c) where
    gboring :: forall a. K1 i c a
gboring = c -> K1 i c a
forall k i c (p :: k). c -> K1 i c p
K1 c
forall a. Boring a => a
boring
class GAbsurd f where
    gabsurd :: f a -> b
instance GAbsurd V1 where
    gabsurd :: forall p b. V1 p -> b
gabsurd V1 a
x = case V1 a
x of {}
instance GAbsurd f => GAbsurd (M1 i c f) where
    gabsurd :: forall a b. M1 i c f a -> b
gabsurd (M1 f a
x) = f a -> b
forall a b. f a -> b
forall (f :: * -> *) a b. GAbsurd f => f a -> b
gabsurd f a
x
instance Absurd c => GAbsurd (K1 i c) where
    gabsurd :: forall a b. K1 i c a -> b
gabsurd (K1 c
x) = c -> b
forall b. c -> b
forall a b. Absurd a => a -> b
absurd c
x
instance (GAbsurd f, GAbsurd g) => GAbsurd (f :+: g) where
    gabsurd :: forall a b. (:+:) f g a -> b
gabsurd (L1 f a
x) = f a -> b
forall a b. f a -> b
forall (f :: * -> *) a b. GAbsurd f => f a -> b
gabsurd f a
x
    gabsurd (R1 g a
y) = g a -> b
forall a b. g a -> b
forall (f :: * -> *) a b. GAbsurd f => f a -> b
gabsurd g a
y