packages feed

singletons-base-3.2: tests/compile-and-dump/Singletons/BoundedDeriving.golden

Singletons/BoundedDeriving.hs:(0,0)-(0,0): Splicing declarations
    singletons
      [d| data Foo1
            = Foo1
            deriving (Bounded)
          data Foo2
            = A | B | C | D | E
            deriving (Bounded)
          data Foo3 a
            = Foo3 a
            deriving (Bounded)
          data Foo4 (a :: Type) (b :: Type)
            = Foo41 | Foo42
            deriving Bounded
          data Pair
            = Pair Bool Bool
            deriving Bounded |]
  ======>
    data Foo1
      = Foo1
      deriving Bounded
    data Foo2
      = A | B | C | D | E
      deriving Bounded
    data Foo3 a
      = Foo3 a
      deriving Bounded
    data Foo4 (a :: Type) (b :: Type)
      = Foo41 | Foo42
      deriving Bounded
    data Pair
      = Pair Bool Bool
      deriving Bounded
    type Foo1Sym0 :: Foo1
    type family Foo1Sym0 :: Foo1 where
      Foo1Sym0 = Foo1
    type ASym0 :: Foo2
    type family ASym0 :: Foo2 where
      ASym0 = A
    type BSym0 :: Foo2
    type family BSym0 :: Foo2 where
      BSym0 = B
    type CSym0 :: Foo2
    type family CSym0 :: Foo2 where
      CSym0 = C
    type DSym0 :: Foo2
    type family DSym0 :: Foo2 where
      DSym0 = D
    type ESym0 :: Foo2
    type family ESym0 :: Foo2 where
      ESym0 = E
    type Foo3Sym0 :: forall a. (~>) a (Foo3 a)
    data Foo3Sym0 :: (~>) a (Foo3 a)
      where
        Foo3Sym0KindInference :: SameKind (Apply Foo3Sym0 arg) (Foo3Sym1 arg) =>
                                 Foo3Sym0 a0123456789876543210
    type instance Apply Foo3Sym0 a0123456789876543210 = Foo3 a0123456789876543210
    instance SuppressUnusedWarnings Foo3Sym0 where
      suppressUnusedWarnings = snd ((,) Foo3Sym0KindInference ())
    type Foo3Sym1 :: forall a. a -> Foo3 a
    type family Foo3Sym1 (a0123456789876543210 :: a) :: Foo3 a where
      Foo3Sym1 a0123456789876543210 = Foo3 a0123456789876543210
    type Foo41Sym0 :: forall (a :: Type)
                             (b :: Type). Foo4 (a :: Type) (b :: Type)
    type family Foo41Sym0 :: Foo4 (a :: Type) (b :: Type) where
      Foo41Sym0 = Foo41
    type Foo42Sym0 :: forall (a :: Type)
                             (b :: Type). Foo4 (a :: Type) (b :: Type)
    type family Foo42Sym0 :: Foo4 (a :: Type) (b :: Type) where
      Foo42Sym0 = Foo42
    type PairSym0 :: (~>) Bool ((~>) Bool Pair)
    data PairSym0 :: (~>) Bool ((~>) Bool Pair)
      where
        PairSym0KindInference :: SameKind (Apply PairSym0 arg) (PairSym1 arg) =>
                                 PairSym0 a0123456789876543210
    type instance Apply PairSym0 a0123456789876543210 = PairSym1 a0123456789876543210
    instance SuppressUnusedWarnings PairSym0 where
      suppressUnusedWarnings = snd ((,) PairSym0KindInference ())
    type PairSym1 :: Bool -> (~>) Bool Pair
    data PairSym1 (a0123456789876543210 :: Bool) :: (~>) Bool Pair
      where
        PairSym1KindInference :: SameKind (Apply (PairSym1 a0123456789876543210) arg) (PairSym2 a0123456789876543210 arg) =>
                                 PairSym1 a0123456789876543210 a0123456789876543210
    type instance Apply (PairSym1 a0123456789876543210) a0123456789876543210 = Pair a0123456789876543210 a0123456789876543210
    instance SuppressUnusedWarnings (PairSym1 a0123456789876543210) where
      suppressUnusedWarnings = snd ((,) PairSym1KindInference ())
    type PairSym2 :: Bool -> Bool -> Pair
    type family PairSym2 (a0123456789876543210 :: Bool) (a0123456789876543210 :: Bool) :: Pair where
      PairSym2 a0123456789876543210 a0123456789876543210 = Pair a0123456789876543210 a0123456789876543210
    type MinBound_0123456789876543210 :: Foo1
    type family MinBound_0123456789876543210 :: Foo1 where
      MinBound_0123456789876543210 = Foo1Sym0
    type MinBound_0123456789876543210Sym0 :: Foo1
    type family MinBound_0123456789876543210Sym0 :: Foo1 where
      MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210
    type MaxBound_0123456789876543210 :: Foo1
    type family MaxBound_0123456789876543210 :: Foo1 where
      MaxBound_0123456789876543210 = Foo1Sym0
    type MaxBound_0123456789876543210Sym0 :: Foo1
    type family MaxBound_0123456789876543210Sym0 :: Foo1 where
      MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210
    instance PBounded Foo1 where
      type MinBound = MinBound_0123456789876543210Sym0
      type MaxBound = MaxBound_0123456789876543210Sym0
    type MinBound_0123456789876543210 :: Foo2
    type family MinBound_0123456789876543210 :: Foo2 where
      MinBound_0123456789876543210 = ASym0
    type MinBound_0123456789876543210Sym0 :: Foo2
    type family MinBound_0123456789876543210Sym0 :: Foo2 where
      MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210
    type MaxBound_0123456789876543210 :: Foo2
    type family MaxBound_0123456789876543210 :: Foo2 where
      MaxBound_0123456789876543210 = ESym0
    type MaxBound_0123456789876543210Sym0 :: Foo2
    type family MaxBound_0123456789876543210Sym0 :: Foo2 where
      MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210
    instance PBounded Foo2 where
      type MinBound = MinBound_0123456789876543210Sym0
      type MaxBound = MaxBound_0123456789876543210Sym0
    type MinBound_0123456789876543210 :: Foo3 a
    type family MinBound_0123456789876543210 :: Foo3 a where
      MinBound_0123456789876543210 = Apply Foo3Sym0 MinBoundSym0
    type MinBound_0123456789876543210Sym0 :: Foo3 a
    type family MinBound_0123456789876543210Sym0 :: Foo3 a where
      MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210
    type MaxBound_0123456789876543210 :: Foo3 a
    type family MaxBound_0123456789876543210 :: Foo3 a where
      MaxBound_0123456789876543210 = Apply Foo3Sym0 MaxBoundSym0
    type MaxBound_0123456789876543210Sym0 :: Foo3 a
    type family MaxBound_0123456789876543210Sym0 :: Foo3 a where
      MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210
    instance PBounded (Foo3 a) where
      type MinBound = MinBound_0123456789876543210Sym0
      type MaxBound = MaxBound_0123456789876543210Sym0
    type MinBound_0123456789876543210 :: Foo4 a b
    type family MinBound_0123456789876543210 :: Foo4 a b where
      MinBound_0123456789876543210 = Foo41Sym0
    type MinBound_0123456789876543210Sym0 :: Foo4 a b
    type family MinBound_0123456789876543210Sym0 :: Foo4 a b where
      MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210
    type MaxBound_0123456789876543210 :: Foo4 a b
    type family MaxBound_0123456789876543210 :: Foo4 a b where
      MaxBound_0123456789876543210 = Foo42Sym0
    type MaxBound_0123456789876543210Sym0 :: Foo4 a b
    type family MaxBound_0123456789876543210Sym0 :: Foo4 a b where
      MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210
    instance PBounded (Foo4 a b) where
      type MinBound = MinBound_0123456789876543210Sym0
      type MaxBound = MaxBound_0123456789876543210Sym0
    type MinBound_0123456789876543210 :: Pair
    type family MinBound_0123456789876543210 :: Pair where
      MinBound_0123456789876543210 = Apply (Apply PairSym0 MinBoundSym0) MinBoundSym0
    type MinBound_0123456789876543210Sym0 :: Pair
    type family MinBound_0123456789876543210Sym0 :: Pair where
      MinBound_0123456789876543210Sym0 = MinBound_0123456789876543210
    type MaxBound_0123456789876543210 :: Pair
    type family MaxBound_0123456789876543210 :: Pair where
      MaxBound_0123456789876543210 = Apply (Apply PairSym0 MaxBoundSym0) MaxBoundSym0
    type MaxBound_0123456789876543210Sym0 :: Pair
    type family MaxBound_0123456789876543210Sym0 :: Pair where
      MaxBound_0123456789876543210Sym0 = MaxBound_0123456789876543210
    instance PBounded Pair where
      type MinBound = MinBound_0123456789876543210Sym0
      type MaxBound = MaxBound_0123456789876543210Sym0
    data SFoo1 :: Foo1 -> Type where SFoo1 :: SFoo1 (Foo1 :: Foo1)
    type instance Sing @Foo1 = SFoo1
    instance SingKind Foo1 where
      type Demote Foo1 = Foo1
      fromSing SFoo1 = Foo1
      toSing Foo1 = SomeSing SFoo1
    data SFoo2 :: Foo2 -> Type
      where
        SA :: SFoo2 (A :: Foo2)
        SB :: SFoo2 (B :: Foo2)
        SC :: SFoo2 (C :: Foo2)
        SD :: SFoo2 (D :: Foo2)
        SE :: SFoo2 (E :: Foo2)
    type instance Sing @Foo2 = SFoo2
    instance SingKind Foo2 where
      type Demote Foo2 = Foo2
      fromSing SA = A
      fromSing SB = B
      fromSing SC = C
      fromSing SD = D
      fromSing SE = E
      toSing A = SomeSing SA
      toSing B = SomeSing SB
      toSing C = SomeSing SC
      toSing D = SomeSing SD
      toSing E = SomeSing SE
    data SFoo3 :: forall a. Foo3 a -> Type
      where
        SFoo3 :: forall a (n :: a). (Sing n) -> SFoo3 (Foo3 n :: Foo3 a)
    type instance Sing @(Foo3 a) = SFoo3
    instance SingKind a => SingKind (Foo3 a) where
      type Demote (Foo3 a) = Foo3 (Demote a)
      fromSing (SFoo3 b) = Foo3 (fromSing b)
      toSing (Foo3 (b :: Demote a))
        = case toSing b :: SomeSing a of SomeSing c -> SomeSing (SFoo3 c)
    data SFoo4 :: forall (a :: Type) (b :: Type). Foo4 a b -> Type
      where
        SFoo41 :: forall (a :: Type) (b :: Type).
                  SFoo4 (Foo41 :: Foo4 (a :: Type) (b :: Type))
        SFoo42 :: forall (a :: Type) (b :: Type).
                  SFoo4 (Foo42 :: Foo4 (a :: Type) (b :: Type))
    type instance Sing @(Foo4 a b) = SFoo4
    instance (SingKind a, SingKind b) => SingKind (Foo4 a b) where
      type Demote (Foo4 a b) = Foo4 (Demote a) (Demote b)
      fromSing SFoo41 = Foo41
      fromSing SFoo42 = Foo42
      toSing Foo41 = SomeSing SFoo41
      toSing Foo42 = SomeSing SFoo42
    data SPair :: Pair -> Type
      where
        SPair :: forall (n :: Bool) (n :: Bool).
                 (Sing n) -> (Sing n) -> SPair (Pair n n :: Pair)
    type instance Sing @Pair = SPair
    instance SingKind Pair where
      type Demote Pair = Pair
      fromSing (SPair b b) = Pair (fromSing b) (fromSing b)
      toSing (Pair (b :: Demote Bool) (b :: Demote Bool))
        = case
              (,) (toSing b :: SomeSing Bool) (toSing b :: SomeSing Bool)
          of
            (,) (SomeSing c) (SomeSing c) -> SomeSing (SPair c c)
    instance SBounded Foo1 where
      sMinBound :: Sing (MinBoundSym0 :: Foo1)
      sMaxBound :: Sing (MaxBoundSym0 :: Foo1)
      sMinBound = SFoo1
      sMaxBound = SFoo1
    instance SBounded Foo2 where
      sMinBound :: Sing (MinBoundSym0 :: Foo2)
      sMaxBound :: Sing (MaxBoundSym0 :: Foo2)
      sMinBound = SA
      sMaxBound = SE
    instance SBounded a => SBounded (Foo3 a) where
      sMinBound :: Sing (MinBoundSym0 :: Foo3 a)
      sMaxBound :: Sing (MaxBoundSym0 :: Foo3 a)
      sMinBound = applySing (singFun1 @Foo3Sym0 SFoo3) sMinBound
      sMaxBound = applySing (singFun1 @Foo3Sym0 SFoo3) sMaxBound
    instance SBounded (Foo4 a b) where
      sMinBound :: Sing (MinBoundSym0 :: Foo4 a b)
      sMaxBound :: Sing (MaxBoundSym0 :: Foo4 a b)
      sMinBound = SFoo41
      sMaxBound = SFoo42
    instance SBounded Bool => SBounded Pair where
      sMinBound :: Sing (MinBoundSym0 :: Pair)
      sMaxBound :: Sing (MaxBoundSym0 :: Pair)
      sMinBound
        = applySing
            (applySing (singFun2 @PairSym0 SPair) sMinBound) sMinBound
      sMaxBound
        = applySing
            (applySing (singFun2 @PairSym0 SPair) sMaxBound) sMaxBound
    instance SingI Foo1 where
      sing = SFoo1
    instance SingI A where
      sing = SA
    instance SingI B where
      sing = SB
    instance SingI C where
      sing = SC
    instance SingI D where
      sing = SD
    instance SingI E where
      sing = SE
    instance SingI n => SingI (Foo3 (n :: a)) where
      sing = SFoo3 sing
    instance SingI1 Foo3 where
      liftSing = SFoo3
    instance SingI (Foo3Sym0 :: (~>) a (Foo3 a)) where
      sing = singFun1 @Foo3Sym0 SFoo3
    instance SingI Foo41 where
      sing = SFoo41
    instance SingI Foo42 where
      sing = SFoo42
    instance (SingI n, SingI n) =>
             SingI (Pair (n :: Bool) (n :: Bool)) where
      sing = SPair sing sing
    instance SingI n => SingI1 (Pair (n :: Bool)) where
      liftSing = SPair sing
    instance SingI2 Pair where
      liftSing2 = SPair
    instance SingI (PairSym0 :: (~>) Bool ((~>) Bool Pair)) where
      sing = singFun2 @PairSym0 SPair
    instance SingI d =>
             SingI (PairSym1 (d :: Bool) :: (~>) Bool Pair) where
      sing = singFun1 @(PairSym1 (d :: Bool)) (SPair (sing @d))
    instance SingI1 (PairSym1 :: Bool -> (~>) Bool Pair) where
      liftSing (s :: Sing (d :: Bool))
        = singFun1 @(PairSym1 (d :: Bool)) (SPair s)