{-# LANGUAGE DataKinds, PolyKinds, UnicodeSyntax, GADTs, NoImplicitPrelude,
             TypeOperators, TypeFamilies #-}
{-# OPTIONS_GHC -fno-warn-unticked-promoted-constructors #-}

module TypeLevelVec where

import Data.Kind

data ℕ ∷ Type where
  O ∷ ℕ
  S ∷ ℕ → ℕ

type family x + y where
  O   + n = n
  S m + n = S (m + n)
infixl 5 +

data Vec ∷ ℕ → Type → Type where
  Nil  ∷ Vec O a
  (:>) ∷ a → Vec n a → Vec (S n) a
infixr 8 :>

type family (x ∷ Vec n a) ++ (y ∷ Vec m a) ∷ Vec (n + m) a where
  Nil       ++ y = y
  (x :> xs) ++ y = x :> (xs ++ y)
infixl 5 ++
