module heap.libraryVec where

open import Data.Nat
open import Data.Unit
open import Data.Product

TupleSimpl : (A : Set)    Set
TupleSimpl A 0 = 
TupleSimpl A (suc n) = A × TupleSimpl A n

Tuple : (A : Set)    Set
Tuple A 0 = 
Tuple A (suc 0) = A
Tuple A (suc n) = A × Tuple A n

headTuple : {A : Set}{n : }(v : Tuple A (suc n))   A
headTuple {A} {zero} v = v
headTuple {A} {suc n} (a , v) = a

tailTuple : {A : Set}{n : }(v : Tuple A (suc n))   Tuple A n
tailTuple {A} {zero} v = _
tailTuple {A} {suc n} (a , v) = v


_∷Vec_ : {A : Set}{n : }(a : A)(v : Tuple A n)  Tuple A (1 + n)
_∷Vec_ {A} {zero} a v = a
_∷Vec_ {A} {suc n} a v = a , v

snocVec : {A : Set}{n : }(v : Tuple A n)(a : A)  Tuple A (n + 1)
snocVec {A} {zero} v a = a
snocVec {A} {suc zero} v a = v , a
snocVec {A} {suc (suc n)} (a' , v) a = a' , snocVec v a


consVec : {A : Set}{n : }(a : A)(v : Tuple A n)  Tuple A (1 + n)
consVec {A} {zero} a v = a
consVec {A} {suc n} a v = a , v