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 :: Foo type family BarSym0 :: Foo where BarSym0 = Bar type BazSym0 :: Foo type family BazSym0 :: Foo where BazSym0 = Baz type BumSym0 :: Foo type family BumSym0 :: Foo where BumSym0 = Bum type Q1Sym0 :: Quux type family Q1Sym0 :: Quux where Q1Sym0 = Q1 type Q2Sym0 :: Quux type family Q2Sym0 :: Quux where 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) (FromInteger 2)) type family Case_0123456789876543210 n t where Case_0123456789876543210 n 'True = BarSym0 Case_0123456789876543210 n 'False = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 1)) type ToEnum_0123456789876543210 :: GHC.Num.Natural.Natural -> Foo type family ToEnum_0123456789876543210 (a :: GHC.Num.Natural.Natural) :: Foo where ToEnum_0123456789876543210 n = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0)) type ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural Foo data ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural Foo where ToEnum_0123456789876543210Sym0KindInference :: SameKind (Apply ToEnum_0123456789876543210Sym0 arg) (ToEnum_0123456789876543210Sym1 arg) => ToEnum_0123456789876543210Sym0 a0123456789876543210 type instance Apply ToEnum_0123456789876543210Sym0 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210 instance SuppressUnusedWarnings ToEnum_0123456789876543210Sym0 where suppressUnusedWarnings = snd ((,) ToEnum_0123456789876543210Sym0KindInference ()) type ToEnum_0123456789876543210Sym1 :: GHC.Num.Natural.Natural -> Foo type family ToEnum_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: Foo where ToEnum_0123456789876543210Sym1 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210 type FromEnum_0123456789876543210 :: Foo -> GHC.Num.Natural.Natural type family FromEnum_0123456789876543210 (a :: Foo) :: GHC.Num.Natural.Natural where FromEnum_0123456789876543210 Bar = FromInteger 0 FromEnum_0123456789876543210 Baz = FromInteger 1 FromEnum_0123456789876543210 Bum = FromInteger 2 type FromEnum_0123456789876543210Sym0 :: (~>) Foo GHC.Num.Natural.Natural data FromEnum_0123456789876543210Sym0 :: (~>) Foo GHC.Num.Natural.Natural where FromEnum_0123456789876543210Sym0KindInference :: SameKind (Apply FromEnum_0123456789876543210Sym0 arg) (FromEnum_0123456789876543210Sym1 arg) => FromEnum_0123456789876543210Sym0 a0123456789876543210 type instance Apply FromEnum_0123456789876543210Sym0 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210 instance SuppressUnusedWarnings FromEnum_0123456789876543210Sym0 where suppressUnusedWarnings = snd ((,) FromEnum_0123456789876543210Sym0KindInference ()) type FromEnum_0123456789876543210Sym1 :: Foo -> GHC.Num.Natural.Natural type family FromEnum_0123456789876543210Sym1 (a0123456789876543210 :: Foo) :: GHC.Num.Natural.Natural where FromEnum_0123456789876543210Sym1 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 -> Type where SBar :: SFoo (Bar :: Foo) SBaz :: SFoo (Baz :: Foo) SBum :: SFoo (Bum :: Foo) 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 -> Type where SQ1 :: SQuux (Q1 :: Quux) SQ2 :: SQuux (Q2 :: Quux) 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.Num.Natural.Natural). Sing t -> Sing (Apply (Data.Singletons.Base.Enum.ToEnumSym0 :: TyFun GHC.Num.Natural.Natural Foo -> Type) t) sFromEnum :: forall (t :: Foo). Sing t -> Sing (Apply (Data.Singletons.Base.Enum.FromEnumSym0 :: TyFun Foo GHC.Num.Natural.Natural -> Type) t) sToEnum (sN :: Sing n) = id @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0)))) (case applySing (applySing (singFun2 @(==@#@$) (%==)) sN) (sFromInteger (sing :: Sing 0)) of STrue -> SBar SFalse -> id @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 1)))) (case applySing (applySing (singFun2 @(==@#@$) (%==)) sN) (sFromInteger (sing :: Sing 1)) of STrue -> SBaz SFalse -> id @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 2)))) (case applySing (applySing (singFun2 @(==@#@$) (%==)) sN) (sFromInteger (sing :: Sing 2)) of STrue -> SBum SFalse -> sError (sing :: Sing "toEnum: bad argument")))) sFromEnum SBar = sFromInteger (sing :: Sing 0) sFromEnum SBaz = sFromInteger (sing :: Sing 1) sFromEnum SBum = 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) (FromInteger 1)) type ToEnum_0123456789876543210 :: GHC.Num.Natural.Natural -> Quux type family ToEnum_0123456789876543210 (a :: GHC.Num.Natural.Natural) :: Quux where ToEnum_0123456789876543210 n = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0)) type ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural Quux data ToEnum_0123456789876543210Sym0 :: (~>) GHC.Num.Natural.Natural Quux where ToEnum_0123456789876543210Sym0KindInference :: SameKind (Apply ToEnum_0123456789876543210Sym0 arg) (ToEnum_0123456789876543210Sym1 arg) => ToEnum_0123456789876543210Sym0 a0123456789876543210 type instance Apply ToEnum_0123456789876543210Sym0 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210 instance SuppressUnusedWarnings ToEnum_0123456789876543210Sym0 where suppressUnusedWarnings = snd ((,) ToEnum_0123456789876543210Sym0KindInference ()) type ToEnum_0123456789876543210Sym1 :: GHC.Num.Natural.Natural -> Quux type family ToEnum_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Num.Natural.Natural) :: Quux where ToEnum_0123456789876543210Sym1 a0123456789876543210 = ToEnum_0123456789876543210 a0123456789876543210 type FromEnum_0123456789876543210 :: Quux -> GHC.Num.Natural.Natural type family FromEnum_0123456789876543210 (a :: Quux) :: GHC.Num.Natural.Natural where FromEnum_0123456789876543210 'Q1 = FromInteger 0 FromEnum_0123456789876543210 'Q2 = FromInteger 1 type FromEnum_0123456789876543210Sym0 :: (~>) Quux GHC.Num.Natural.Natural data FromEnum_0123456789876543210Sym0 :: (~>) Quux GHC.Num.Natural.Natural where FromEnum_0123456789876543210Sym0KindInference :: SameKind (Apply FromEnum_0123456789876543210Sym0 arg) (FromEnum_0123456789876543210Sym1 arg) => FromEnum_0123456789876543210Sym0 a0123456789876543210 type instance Apply FromEnum_0123456789876543210Sym0 a0123456789876543210 = FromEnum_0123456789876543210 a0123456789876543210 instance SuppressUnusedWarnings FromEnum_0123456789876543210Sym0 where suppressUnusedWarnings = snd ((,) FromEnum_0123456789876543210Sym0KindInference ()) type FromEnum_0123456789876543210Sym1 :: Quux -> GHC.Num.Natural.Natural type family FromEnum_0123456789876543210Sym1 (a0123456789876543210 :: Quux) :: GHC.Num.Natural.Natural where FromEnum_0123456789876543210Sym1 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.Num.Natural.Natural). Sing t -> Sing (Apply (Data.Singletons.Base.Enum.ToEnumSym0 :: TyFun GHC.Num.Natural.Natural Quux -> Type) t) sFromEnum :: forall (t :: Quux). Sing t -> Sing (Apply (Data.Singletons.Base.Enum.FromEnumSym0 :: TyFun Quux GHC.Num.Natural.Natural -> Type) t) sToEnum (sN :: Sing n) = id @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 0)))) (case applySing (applySing (singFun2 @(==@#@$) (%==)) sN) (sFromInteger (sing :: Sing 0)) of STrue -> SQ1 SFalse -> id @(Sing (Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (FromInteger 1)))) (case applySing (applySing (singFun2 @(==@#@$) (%==)) sN) (sFromInteger (sing :: Sing 1)) of STrue -> SQ2 SFalse -> sError (sing :: Sing "toEnum: bad argument"))) sFromEnum SQ1 = sFromInteger (sing :: Sing 0) sFromEnum SQ2 = sFromInteger (sing :: Sing 1)