packages feed

singletons-1.0: tests/compile-and-dump/Singletons/AsPattern.ghc76.template

Singletons/AtPattern.hs:0:0: Splicing declarations
    singletons
      [d| maybePlus :: Maybe Nat -> Maybe Nat
          maybePlus (Just n) = Just (plus (Succ Zero) n)
          maybePlus p@Nothing = p
          bar :: Maybe Nat -> Maybe Nat
          bar x@(Just _) = x
          bar Nothing = Nothing
          baz_ :: Maybe Baz -> Maybe Baz
          baz_ p@Nothing = p
          baz_ p@(Just (Baz _ _ _)) = p
          tup :: (Nat, Nat) -> (Nat, Nat)
          tup p@(_, _) = p
          foo :: [Nat] -> [Nat]
          foo p@[] = p
          foo p@[_] = p
          foo p@(_ : _) = p
          
          data Baz = Baz Nat Nat Nat |]
  ======>
    Singletons/AtPattern.hs:(0,0)-(0,0)
    maybePlus :: Maybe Nat -> Maybe Nat
    maybePlus (Just n) = Just (plus (Succ Zero) n)
    maybePlus p@Nothing = p
    bar :: Maybe Nat -> Maybe Nat
    bar x@(Just _) = x
    bar Nothing = Nothing
    data Baz = Baz Nat Nat Nat
    baz_ :: Maybe Baz -> Maybe Baz
    baz_ p@Nothing = p
    baz_ p@(Just (Baz _ _ _)) = p
    tup :: (Nat, Nat) -> (Nat, Nat)
    tup p@(_, _) = p
    foo :: [Nat] -> [Nat]
    foo p@GHC.Types.[] = p
    foo p@[_] = p
    foo p@(_ GHC.Types.: _) = p
    type BazTyCtor = Baz
    type BazTyCtorSym0 = BazTyCtor
    data BazSym2 (l :: Nat) (l :: Nat) (l :: TyFun Nat Baz)
    data BazSym1 (l :: Nat) (l :: TyFun Nat (TyFun Nat Baz -> *))
    data BazSym0 (k :: TyFun Nat (TyFun Nat (TyFun Nat Baz -> *) -> *))
    type instance Apply (BazSym2 a a) a = Baz a a a
    type instance Apply (BazSym1 a) a = BazSym2 a a
    type instance Apply BazSym0 a = BazSym1 a
    type family MaybePlus (a :: Maybe Nat) :: Maybe Nat
    type instance MaybePlus (Just n) =
        Apply JustSym0 (Apply (Apply PlusSym0 (Apply SuccSym0 ZeroSym0)) n)
    type instance MaybePlus Nothing = NothingSym0
    data MaybePlusSym0 (k :: TyFun (Maybe Nat) (Maybe Nat))
    type instance Apply MaybePlusSym0 a = MaybePlus a
    type family Bar (a :: Maybe Nat) :: Maybe Nat
    type instance Bar (Just z) = Apply JustSym0 z
    type instance Bar Nothing = NothingSym0
    data BarSym0 (k :: TyFun (Maybe Nat) (Maybe Nat))
    type instance Apply BarSym0 a = Bar a
    type family Baz_ (a :: Maybe Baz) :: Maybe Baz
    type instance Baz_ Nothing = NothingSym0
    type instance Baz_ (Just (Baz z z z)) =
        Apply JustSym0 (Apply (Apply (Apply BazSym0 z) z) z)
    data Baz_Sym0 (k :: TyFun (Maybe Baz) (Maybe Baz))
    type instance Apply Baz_Sym0 a = Baz_ a
    type family Tup (a :: (Nat, Nat)) :: (Nat, Nat)
    type instance Tup '(z, z) = Apply (Apply Tuple2Sym0 z) z
    data TupSym0 (k :: TyFun (Nat, Nat) (Nat, Nat))
    type instance Apply TupSym0 a = Tup a
    type family Foo (a :: [Nat]) :: [Nat]
    type instance Foo GHC.Types.[] = GHC.Types.[]
    type instance Foo '[z] = Apply (Apply :$ z) GHC.Types.[]
    type instance Foo (GHC.Types.: z z) = Apply (Apply :$ z) z
    data FooSym0 (k :: TyFun [Nat] [Nat])
    type instance Apply FooSym0 a = Foo a
    sMaybePlus :: forall (t :: Maybe Nat). Sing t -> Sing (MaybePlus t)
    sMaybePlus (SJust n) = SJust (sPlus (SSucc SZero) n)
    sMaybePlus p@SNothing = p
    sBar :: forall (t :: Maybe Nat). Sing t -> Sing (Bar t)
    sBar x@(SJust _) = x
    sBar SNothing = SNothing
    data instance Sing (z :: Baz)
      = forall (n :: Nat) (n :: Nat) (n :: Nat). z ~ Baz n n n =>
        SBaz (Sing n) (Sing n) (Sing n)
    type SBaz (z :: Baz) = Sing z
    instance SingKind (KProxy :: KProxy Baz) where
      type instance DemoteRep (KProxy :: KProxy Baz) = Baz
      fromSing (SBaz b b b) = Baz (fromSing b) (fromSing b) (fromSing b)
      toSing (Baz b b b)
        = case
              (toSing b :: SomeSing (KProxy :: KProxy Nat), 
               toSing b :: SomeSing (KProxy :: KProxy Nat), 
               toSing b :: SomeSing (KProxy :: KProxy Nat))
          of {
            (SomeSing c, SomeSing c, SomeSing c) -> SomeSing (SBaz c c c) }
    instance (SingI n, SingI n, SingI n) =>
             SingI (Baz (n :: Nat) (n :: Nat) (n :: Nat)) where
      sing = SBaz sing sing sing
    sBaz_ :: forall (t :: Maybe Baz). Sing t -> Sing (Baz_ t)
    sBaz_ p@SNothing = p
    sBaz_ p@(SJust (SBaz _ _ _)) = p
    sTup :: forall (t :: (Nat, Nat)). Sing t -> Sing (Tup t)
    sTup p@(STuple2 _ _) = p
    sFoo :: forall (t :: [Nat]). Sing t -> Sing (Foo t)
    sFoo p@SNil = p
    sFoo p@(SCons _ SNil) = p
    sFoo p@(SCons _ _) = p