packages feed

sydtest-0.15.1.2: src/Test/Syd/HList.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE IncoherentInstances #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeOperators #-}

module Test.Syd.HList where

import Data.Kind

data HList (r :: [Type]) where
  HNil :: HList '[]
  HCons :: e -> HList l -> HList (e ': l)

class HContains (l :: [Type]) a where
  getElem :: HList l -> a

instance HContains '[] () where
  getElem HNil = ()

instance HContains l (HList l) where
  getElem = id

instance HContains '[a] a where
  getElem (HCons a _) = a

instance HContains (a ': l) a where
  getElem (HCons a _) = a

instance (HContains l a) => HContains (b ': l) a where
  getElem (HCons _ hl) = getElem hl