singletons-2.6: tests/compile-and-dump/Singletons/EnumDeriving.ghc88.template
Singletons/EnumDeriving.hs:(0,0)-(0,0): Splicing declarations
singletons
[d| data Foo
= Bar | Baz | Bum
deriving Enum
data Quux = Q1 | Q2 |]
======>
data Foo
= Bar | Baz | Bum
deriving Enum
data Quux = Q1 | Q2
type BarSym0 = Bar
type BazSym0 = Baz
type BumSym0 = Bum
type Q1Sym0 = Q1
type Q2Sym0 = Q2
type family Case_0123456789876543210 n t where
Case_0123456789876543210 n 'True = BumSym0
Case_0123456789876543210 n 'False = Apply ErrorSym0 "toEnum: bad argument"
type family Case_0123456789876543210 n t where
Case_0123456789876543210 n 'True = BazSym0
Case_0123456789876543210 n 'False = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (Data.Singletons.Prelude.Num.FromInteger 2))
type family Case_0123456789876543210 n t where
Case_0123456789876543210 n 'True = BarSym0
Case_0123456789876543210 n 'False = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (Data.Singletons.Prelude.Num.FromInteger 1))
type family ToEnum_0123456789876543210 (a :: GHC.Types.Nat) :: Foo where
ToEnum_0123456789876543210 n = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (Data.Singletons.Prelude.Num.FromInteger 0))
type ToEnum_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Types.Nat) =
ToEnum_0123456789876543210 a0123456789876543210
instance SuppressUnusedWarnings ToEnum_0123456789876543210Sym0 where
suppressUnusedWarnings
= snd (((,) ToEnum_0123456789876543210Sym0KindInference) ())
data ToEnum_0123456789876543210Sym0 :: (~>) GHC.Types.Nat Foo
where
ToEnum_0123456789876543210Sym0KindInference :: forall a0123456789876543210
arg. SameKind (Apply ToEnum_0123456789876543210Sym0 arg) (ToEnum_0123456789876543210Sym1 arg) =>
ToEnum_0123456789876543210Sym0 a0123456789876543210
type instance Apply ToEnum_0123456789876543210Sym0 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210
type family FromEnum_0123456789876543210 (a :: Foo) :: GHC.Types.Nat where
FromEnum_0123456789876543210 Bar = Data.Singletons.Prelude.Num.FromInteger 0
FromEnum_0123456789876543210 Baz = Data.Singletons.Prelude.Num.FromInteger 1
FromEnum_0123456789876543210 Bum = Data.Singletons.Prelude.Num.FromInteger 2
type FromEnum_0123456789876543210Sym1 (a0123456789876543210 :: Foo) =
FromEnum_0123456789876543210 a0123456789876543210
instance SuppressUnusedWarnings FromEnum_0123456789876543210Sym0 where
suppressUnusedWarnings
= snd (((,) FromEnum_0123456789876543210Sym0KindInference) ())
data FromEnum_0123456789876543210Sym0 :: (~>) Foo GHC.Types.Nat
where
FromEnum_0123456789876543210Sym0KindInference :: forall a0123456789876543210
arg. SameKind (Apply FromEnum_0123456789876543210Sym0 arg) (FromEnum_0123456789876543210Sym1 arg) =>
FromEnum_0123456789876543210Sym0 a0123456789876543210
type instance Apply FromEnum_0123456789876543210Sym0 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210
instance PEnum Foo where
type ToEnum a = Apply ToEnum_0123456789876543210Sym0 a
type FromEnum a = Apply FromEnum_0123456789876543210Sym0 a
data SFoo :: Foo -> GHC.Types.Type
where
SBar :: SFoo Bar
SBaz :: SFoo Baz
SBum :: SFoo Bum
type instance Sing @Foo = SFoo
instance SingKind Foo where
type Demote Foo = Foo
fromSing SBar = Bar
fromSing SBaz = Baz
fromSing SBum = Bum
toSing Bar = SomeSing SBar
toSing Baz = SomeSing SBaz
toSing Bum = SomeSing SBum
data SQuux :: Quux -> GHC.Types.Type
where
SQ1 :: SQuux Q1
SQ2 :: SQuux Q2
type instance Sing @Quux = SQuux
instance SingKind Quux where
type Demote Quux = Quux
fromSing SQ1 = Q1
fromSing SQ2 = Q2
toSing Q1 = SomeSing SQ1
toSing Q2 = SomeSing SQ2
instance SEnum Foo where
sToEnum ::
forall (t :: GHC.Types.Nat).
Sing t
-> Sing (Apply (Data.Singletons.Prelude.Enum.ToEnumSym0 :: TyFun GHC.Types.Nat Foo
-> GHC.Types.Type) t)
sFromEnum ::
forall (t :: Foo).
Sing t
-> Sing (Apply (Data.Singletons.Prelude.Enum.FromEnumSym0 :: TyFun Foo GHC.Types.Nat
-> GHC.Types.Type) t)
sToEnum (sN :: Sing n)
= (id
@(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (Data.Singletons.Prelude.Num.FromInteger 0)))))
(case
(applySing ((applySing ((singFun2 @(==@#@$)) (%==))) sN))
(Data.Singletons.Prelude.Num.sFromInteger (sing :: Sing 0))
of
STrue -> SBar
SFalse
-> (id
@(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (Data.Singletons.Prelude.Num.FromInteger 1)))))
(case
(applySing ((applySing ((singFun2 @(==@#@$)) (%==))) sN))
(Data.Singletons.Prelude.Num.sFromInteger (sing :: Sing 1))
of
STrue -> SBaz
SFalse
-> (id
@(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (Data.Singletons.Prelude.Num.FromInteger 2)))))
(case
(applySing ((applySing ((singFun2 @(==@#@$)) (%==))) sN))
(Data.Singletons.Prelude.Num.sFromInteger (sing :: Sing 2))
of
STrue -> SBum
SFalse -> sError (sing :: Sing "toEnum: bad argument"))))
sFromEnum SBar
= Data.Singletons.Prelude.Num.sFromInteger (sing :: Sing 0)
sFromEnum SBaz
= Data.Singletons.Prelude.Num.sFromInteger (sing :: Sing 1)
sFromEnum SBum
= Data.Singletons.Prelude.Num.sFromInteger (sing :: Sing 2)
instance SingI Bar where
sing = SBar
instance SingI Baz where
sing = SBaz
instance SingI Bum where
sing = SBum
instance SingI Q1 where
sing = SQ1
instance SingI Q2 where
sing = SQ2
Singletons/EnumDeriving.hs:0:0:: Splicing declarations
singEnumInstance ''Quux
======>
type family Case_0123456789876543210 n t where
Case_0123456789876543210 n 'True = Q2Sym0
Case_0123456789876543210 n 'False = Apply ErrorSym0 "toEnum: bad argument"
type family Case_0123456789876543210 n t where
Case_0123456789876543210 n 'True = Q1Sym0
Case_0123456789876543210 n 'False = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (Data.Singletons.Prelude.Num.FromInteger 1))
type family ToEnum_0123456789876543210 (a :: GHC.Types.Nat) :: Quux where
ToEnum_0123456789876543210 n = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (Data.Singletons.Prelude.Num.FromInteger 0))
type ToEnum_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Types.Nat) =
ToEnum_0123456789876543210 a0123456789876543210
instance SuppressUnusedWarnings ToEnum_0123456789876543210Sym0 where
suppressUnusedWarnings
= snd (((,) ToEnum_0123456789876543210Sym0KindInference) ())
data ToEnum_0123456789876543210Sym0 :: (~>) GHC.Types.Nat Quux
where
ToEnum_0123456789876543210Sym0KindInference :: forall a0123456789876543210
arg. SameKind (Apply ToEnum_0123456789876543210Sym0 arg) (ToEnum_0123456789876543210Sym1 arg) =>
ToEnum_0123456789876543210Sym0 a0123456789876543210
type instance Apply ToEnum_0123456789876543210Sym0 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210
type family FromEnum_0123456789876543210 (a :: Quux) :: GHC.Types.Nat where
FromEnum_0123456789876543210 'Q1 = Data.Singletons.Prelude.Num.FromInteger 0
FromEnum_0123456789876543210 'Q2 = Data.Singletons.Prelude.Num.FromInteger 1
type FromEnum_0123456789876543210Sym1 (a0123456789876543210 :: Quux) =
FromEnum_0123456789876543210 a0123456789876543210
instance SuppressUnusedWarnings FromEnum_0123456789876543210Sym0 where
suppressUnusedWarnings
= snd (((,) FromEnum_0123456789876543210Sym0KindInference) ())
data FromEnum_0123456789876543210Sym0 :: (~>) Quux GHC.Types.Nat
where
FromEnum_0123456789876543210Sym0KindInference :: forall a0123456789876543210
arg. SameKind (Apply FromEnum_0123456789876543210Sym0 arg) (FromEnum_0123456789876543210Sym1 arg) =>
FromEnum_0123456789876543210Sym0 a0123456789876543210
type instance Apply FromEnum_0123456789876543210Sym0 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210
instance PEnum Quux where
type ToEnum a = Apply ToEnum_0123456789876543210Sym0 a
type FromEnum a = Apply FromEnum_0123456789876543210Sym0 a
instance SEnum Quux where
sToEnum ::
forall (t :: GHC.Types.Nat).
Sing t
-> Sing (Apply (Data.Singletons.Prelude.Enum.ToEnumSym0 :: TyFun GHC.Types.Nat Quux
-> GHC.Types.Type) t)
sFromEnum ::
forall (t :: Quux).
Sing t
-> Sing (Apply (Data.Singletons.Prelude.Enum.FromEnumSym0 :: TyFun Quux GHC.Types.Nat
-> GHC.Types.Type) t)
sToEnum (sN :: Sing n)
= (id
@(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (Data.Singletons.Prelude.Num.FromInteger 0)))))
(case
(applySing ((applySing ((singFun2 @(==@#@$)) (%==))) sN))
(Data.Singletons.Prelude.Num.sFromInteger (sing :: Sing 0))
of
STrue -> SQ1
SFalse
-> (id
@(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (Data.Singletons.Prelude.Num.FromInteger 1)))))
(case
(applySing ((applySing ((singFun2 @(==@#@$)) (%==))) sN))
(Data.Singletons.Prelude.Num.sFromInteger (sing :: Sing 1))
of
STrue -> SQ2
SFalse -> sError (sing :: Sing "toEnum: bad argument")))
sFromEnum SQ1
= Data.Singletons.Prelude.Num.sFromInteger (sing :: Sing 0)
sFromEnum SQ2
= Data.Singletons.Prelude.Num.sFromInteger (sing :: Sing 1)