packages feed

singletons-base-3.2: tests/compile-and-dump/Singletons/T150.hs

module T150 where

import Control.Monad.Trans.Class
import Data.Kind
import Data.Singletons.TH
import Data.Singletons.TH.Options
import Singletons.Nat

$(withOptions defaultOptions{genSingKindInsts = False} $
    singletons $ lift
    [d| data Fin :: Nat -> Type where
          FZ :: Fin (Succ n)
          FS :: Fin n -> Fin (Succ n)

        data Foo :: Type -> Type where
          MkFoo1 :: Foo Bool
          MkFoo2 :: Foo Ordering

        data Vec :: Nat -> Type -> Type where
          VNil  :: Vec Zero a
          VCons :: a -> Vec n a -> Vec (Succ n) a

        headVec :: Vec (Succ n) a -> a
        headVec (VCons x _) = x

        tailVec :: Vec (Succ n) a -> Vec n a
        tailVec (VCons _ xs) = xs

        (!) :: Vec n a -> Fin n -> a
        VCons x _  ! FZ   = x
        VCons _ xs ! FS n = xs ! n
        VNil       ! n    = case n of {}

        mapVec :: (a -> b) -> Vec n a -> Vec n b
        mapVec _ VNil         = VNil
        mapVec f (VCons x xs) = VCons (f x) (mapVec f xs)

        data Equal :: Type -> Type -> Type where
          Reflexive :: Equal a a

        symmetry :: Equal a b -> Equal b a
        symmetry Reflexive = Reflexive

        transitivity :: Equal a b -> Equal b c -> Equal a c
        transitivity Reflexive Reflexive = Reflexive

        data HList :: [Type] -> Type where
          HNil  :: HList '[]
          HCons :: x -> HList xs -> HList (x:xs)

        data Obj :: Type where
          Obj :: a -> Obj
    |])