packages feed

singletons-2.1: tests/compile-and-dump/Singletons/Classes2.ghc80.template

Singletons/Classes2.hs:(0,0)-(0,0): Splicing declarations
    singletons
      [d| data NatFoo = ZeroFoo | SuccFoo NatFoo
          
          instance MyOrd NatFoo where
            ZeroFoo `mycompare` ZeroFoo = EQ
            ZeroFoo `mycompare` (SuccFoo _) = LT
            (SuccFoo _) `mycompare` ZeroFoo = GT
            (SuccFoo n) `mycompare` (SuccFoo m) = m `mycompare` n |]
  ======>
    data NatFoo = ZeroFoo | SuccFoo NatFoo
    instance MyOrd NatFoo where
      mycompare ZeroFoo ZeroFoo = EQ
      mycompare ZeroFoo (SuccFoo _) = LT
      mycompare (SuccFoo _) ZeroFoo = GT
      mycompare (SuccFoo n) (SuccFoo m) = (m `mycompare` n)
    type ZeroFooSym0 = ZeroFoo
    type SuccFooSym1 (t :: NatFoo) = SuccFoo t
    instance SuppressUnusedWarnings SuccFooSym0 where
      suppressUnusedWarnings _
        = snd (GHC.Tuple.(,) SuccFooSym0KindInference GHC.Tuple.())
    data SuccFooSym0 (l :: TyFun NatFoo NatFoo)
      = forall arg. KindOf (Apply SuccFooSym0 arg) ~ KindOf (SuccFooSym1 arg) =>
        SuccFooSym0KindInference
    type instance Apply SuccFooSym0 l = SuccFooSym1 l
    type family Mycompare_0123456789 (a :: NatFoo)
                                     (a :: NatFoo) :: Ordering where
      Mycompare_0123456789 ZeroFoo ZeroFoo = EQSym0
      Mycompare_0123456789 ZeroFoo (SuccFoo _z_0123456789) = LTSym0
      Mycompare_0123456789 (SuccFoo _z_0123456789) ZeroFoo = GTSym0
      Mycompare_0123456789 (SuccFoo n) (SuccFoo m) = Apply (Apply MycompareSym0 m) n
    type Mycompare_0123456789Sym2 (t :: NatFoo) (t :: NatFoo) =
        Mycompare_0123456789 t t
    instance SuppressUnusedWarnings Mycompare_0123456789Sym1 where
      suppressUnusedWarnings _
        = snd
            (GHC.Tuple.(,) Mycompare_0123456789Sym1KindInference GHC.Tuple.())
    data Mycompare_0123456789Sym1 (l :: NatFoo)
                                  (l :: TyFun NatFoo Ordering)
      = forall arg. KindOf (Apply (Mycompare_0123456789Sym1 l) arg) ~ KindOf (Mycompare_0123456789Sym2 l arg) =>
        Mycompare_0123456789Sym1KindInference
    type instance Apply (Mycompare_0123456789Sym1 l) l = Mycompare_0123456789Sym2 l l
    instance SuppressUnusedWarnings Mycompare_0123456789Sym0 where
      suppressUnusedWarnings _
        = snd
            (GHC.Tuple.(,) Mycompare_0123456789Sym0KindInference GHC.Tuple.())
    data Mycompare_0123456789Sym0 (l :: TyFun NatFoo (TyFun NatFoo Ordering
                                                      -> GHC.Types.Type))
      = forall arg. KindOf (Apply Mycompare_0123456789Sym0 arg) ~ KindOf (Mycompare_0123456789Sym1 arg) =>
        Mycompare_0123456789Sym0KindInference
    type instance Apply Mycompare_0123456789Sym0 l = Mycompare_0123456789Sym1 l
    instance PMyOrd (KProxy :: KProxy NatFoo) where
      type Mycompare (a :: NatFoo) (a :: NatFoo) = Apply (Apply Mycompare_0123456789Sym0 a) a
    data instance Sing (z :: NatFoo)
      = z ~ ZeroFoo => SZeroFoo |
        forall (n :: NatFoo). z ~ SuccFoo n =>
        SSuccFoo (Sing (n :: NatFoo))
    type SNatFoo = (Sing :: NatFoo -> GHC.Types.Type)
    instance SingKind (KProxy :: KProxy NatFoo) where
      type DemoteRep (KProxy :: KProxy NatFoo) = NatFoo
      fromSing SZeroFoo = ZeroFoo
      fromSing (SSuccFoo b) = SuccFoo (fromSing b)
      toSing ZeroFoo = SomeSing SZeroFoo
      toSing (SuccFoo b)
        = case toSing b :: SomeSing (KProxy :: KProxy NatFoo) of {
            SomeSing c -> SomeSing (SSuccFoo c) }
    instance SMyOrd (KProxy :: KProxy NatFoo) where
      sMycompare ::
        forall (t0 :: NatFoo) (t1 :: NatFoo).
        Sing t0
        -> Sing t1
           -> Sing (Apply (Apply (MycompareSym0 :: TyFun NatFoo (TyFun NatFoo Ordering
                                                                 -> GHC.Types.Type)
                                                   -> GHC.Types.Type) t0 :: TyFun NatFoo Ordering
                                                                            -> GHC.Types.Type) t1 :: Ordering)
      sMycompare SZeroFoo SZeroFoo
        = let
            lambda ::
              (t0 ~ ZeroFooSym0, t1 ~ ZeroFooSym0) =>
              Sing (Apply (Apply MycompareSym0 t0) t1 :: Ordering)
            lambda = SEQ
          in lambda
      sMycompare SZeroFoo (SSuccFoo _s_z_0123456789)
        = let
            lambda ::
              forall _z_0123456789.
              (t0 ~ ZeroFooSym0, t1 ~ Apply SuccFooSym0 _z_0123456789) =>
              Sing _z_0123456789
              -> Sing (Apply (Apply MycompareSym0 t0) t1 :: Ordering)
            lambda _z_0123456789 = SLT
          in lambda _s_z_0123456789
      sMycompare (SSuccFoo _s_z_0123456789) SZeroFoo
        = let
            lambda ::
              forall _z_0123456789.
              (t0 ~ Apply SuccFooSym0 _z_0123456789, t1 ~ ZeroFooSym0) =>
              Sing _z_0123456789
              -> Sing (Apply (Apply MycompareSym0 t0) t1 :: Ordering)
            lambda _z_0123456789 = SGT
          in lambda _s_z_0123456789
      sMycompare (SSuccFoo sN) (SSuccFoo sM)
        = let
            lambda ::
              forall n m.
              (t0 ~ Apply SuccFooSym0 n, t1 ~ Apply SuccFooSym0 m) =>
              Sing n
              -> Sing m -> Sing (Apply (Apply MycompareSym0 t0) t1 :: Ordering)
            lambda n m
              = applySing
                  (applySing (singFun2 (Proxy :: Proxy MycompareSym0) sMycompare) m)
                  n
          in lambda sN sM
    instance SingI ZeroFoo where
      sing = SZeroFoo
    instance SingI n => SingI (SuccFoo (n :: NatFoo)) where
      sing = SSuccFoo sing