packages feed

singletons-2.7: tests/compile-and-dump/Singletons/EnumDeriving.golden

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 :: Foo
    type BazSym0 = Baz :: Foo
    type BumSym0 = Bum :: Foo
    type Q1Sym0 = Q1 :: Quux
    type Q2Sym0 = Q2 :: Quux
    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 ToEnum_0123456789876543210 :: GHC.Types.Nat -> Foo
    type family ToEnum_0123456789876543210 a where
      ToEnum_0123456789876543210 n = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (Data.Singletons.Prelude.Num.FromInteger 0))
    type ToEnum_0123456789876543210Sym0 :: (~>) GHC.Types.Nat Foo
    data ToEnum_0123456789876543210Sym0 a0123456789876543210
      where
        ToEnum_0123456789876543210Sym0KindInference :: SameKind (Apply ToEnum_0123456789876543210Sym0 arg) (ToEnum_0123456789876543210Sym1 arg) =>
                                                       ToEnum_0123456789876543210Sym0 a0123456789876543210
    type instance Apply ToEnum_0123456789876543210Sym0 a0123456789876543210 = ToEnum_0123456789876543210Sym1 a0123456789876543210
    instance SuppressUnusedWarnings ToEnum_0123456789876543210Sym0 where
      suppressUnusedWarnings
        = snd (((,) ToEnum_0123456789876543210Sym0KindInference) ())
    type ToEnum_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Types.Nat) =
        ToEnum_0123456789876543210 a0123456789876543210 :: Foo
    type FromEnum_0123456789876543210 :: Foo -> GHC.Types.Nat
    type family FromEnum_0123456789876543210 a 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_0123456789876543210Sym0 :: (~>) Foo GHC.Types.Nat
    data FromEnum_0123456789876543210Sym0 a0123456789876543210
      where
        FromEnum_0123456789876543210Sym0KindInference :: SameKind (Apply FromEnum_0123456789876543210Sym0 arg) (FromEnum_0123456789876543210Sym1 arg) =>
                                                         FromEnum_0123456789876543210Sym0 a0123456789876543210
    type instance Apply FromEnum_0123456789876543210Sym0 a0123456789876543210 = FromEnum_0123456789876543210Sym1 a0123456789876543210
    instance SuppressUnusedWarnings FromEnum_0123456789876543210Sym0 where
      suppressUnusedWarnings
        = snd (((,) FromEnum_0123456789876543210Sym0KindInference) ())
    type FromEnum_0123456789876543210Sym1 (a0123456789876543210 :: Foo) =
        FromEnum_0123456789876543210 a0123456789876543210 :: GHC.Types.Nat
    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 :: 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 -> GHC.Types.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.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 ToEnum_0123456789876543210 :: GHC.Types.Nat -> Quux
    type family ToEnum_0123456789876543210 a where
      ToEnum_0123456789876543210 n = Case_0123456789876543210 n (Apply (Apply (==@#@$) n) (Data.Singletons.Prelude.Num.FromInteger 0))
    type ToEnum_0123456789876543210Sym0 :: (~>) GHC.Types.Nat Quux
    data ToEnum_0123456789876543210Sym0 a0123456789876543210
      where
        ToEnum_0123456789876543210Sym0KindInference :: SameKind (Apply ToEnum_0123456789876543210Sym0 arg) (ToEnum_0123456789876543210Sym1 arg) =>
                                                       ToEnum_0123456789876543210Sym0 a0123456789876543210
    type instance Apply ToEnum_0123456789876543210Sym0 a0123456789876543210 = ToEnum_0123456789876543210Sym1 a0123456789876543210
    instance SuppressUnusedWarnings ToEnum_0123456789876543210Sym0 where
      suppressUnusedWarnings
        = snd (((,) ToEnum_0123456789876543210Sym0KindInference) ())
    type ToEnum_0123456789876543210Sym1 (a0123456789876543210 :: GHC.Types.Nat) =
        ToEnum_0123456789876543210 a0123456789876543210 :: Quux
    type FromEnum_0123456789876543210 :: Quux -> GHC.Types.Nat
    type family FromEnum_0123456789876543210 a where
      FromEnum_0123456789876543210 'Q1 = Data.Singletons.Prelude.Num.FromInteger 0
      FromEnum_0123456789876543210 'Q2 = Data.Singletons.Prelude.Num.FromInteger 1
    type FromEnum_0123456789876543210Sym0 :: (~>) Quux GHC.Types.Nat
    data FromEnum_0123456789876543210Sym0 a0123456789876543210
      where
        FromEnum_0123456789876543210Sym0KindInference :: SameKind (Apply FromEnum_0123456789876543210Sym0 arg) (FromEnum_0123456789876543210Sym1 arg) =>
                                                         FromEnum_0123456789876543210Sym0 a0123456789876543210
    type instance Apply FromEnum_0123456789876543210Sym0 a0123456789876543210 = FromEnum_0123456789876543210Sym1 a0123456789876543210
    instance SuppressUnusedWarnings FromEnum_0123456789876543210Sym0 where
      suppressUnusedWarnings
        = snd (((,) FromEnum_0123456789876543210Sym0KindInference) ())
    type FromEnum_0123456789876543210Sym1 (a0123456789876543210 :: Quux) =
        FromEnum_0123456789876543210 a0123456789876543210 :: GHC.Types.Nat
    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)