# LANGUAGE TypeFamilies , DataKinds , TypeOperators #
{-# OPTIONS -W #-}

module Language.Hakaru.Util.HList where

class TList (xs :: [*]) where
  data VList (xs :: [*]) :: *
  type Append (xs :: [*]) (ys :: [*]) :: [*]
  append :: VList xs -> VList ys -> VList (Append xs ys)
  vsplit :: VList (Append xs ys) -> (VList xs, VList ys)

instance TList '[] where
  data VList '[] = VNil
  type Append '[] ys = ys
  append VNil ys = ys
  vsplit ys = (VNil, ys)

instance TList xs => TList (x ': xs) where
  data VList (x ': xs) = VCons x (VList xs)
  type Append (x ': xs) ys = x ': Append xs ys
  append (VCons x xs) ys = VCons x (append xs ys)
  vsplit (VCons x zs) = let (xs, ys) = vsplit zs in (VCons x xs, ys)

# OPTIONS -W #
# LANGUAGE TypeFamilies , DataKinds , TypeOperators #

module Language.Hakaru.Util.HList where

class TList (xs :: [*]) where
  data VList (xs :: [*]) :: *
  type Append (xs :: [*]) (ys :: [*]) :: [*]
  append :: VList xs -> VList ys -> VList (Append xs ys)
  vsplit :: VList (Append xs ys) -> (VList xs, VList ys)

instance TList '[] where
  data VList '[] = VNil
  type Append '[] ys = ys
  append VNil ys = ys
  vsplit ys = (VNil, ys)

instance TList xs => TList (x ': xs) where
  data VList (x ': xs) = VCons x (VList xs)
  type Append (x ': xs) ys = x ': Append xs ys
  append (VCons x xs) ys = VCons x (append xs ys)
  vsplit (VCons x zs) = let (xs, ys) = vsplit zs in (VCons x xs, ys)
