module Vec where open import Star open import Nat data Step (A : Set) : Nat -> Nat -> Set where step : (x : A){n : Nat} -> Step A (suc n) n Vec : (A : Set) -> Nat -> Set Vec A n = Star (Step A) n zero [] : {A : Set} -> Vec A zero [] = ε _::_ : {A : Set}{n : Nat} -> A -> Vec A n -> Vec A (suc n) x :: xs = step x • xs _+++_ : {A : Set}{n m : Nat} -> Vec A n -> Vec A m -> Vec A (n + m) _+++_ {A}{m = m} xs ys = map +m step+m xs ++ ys where +m = \z -> z + m step+m : Step A =[ +m ]=> Step A step+m (step x) = step x vec : {A : Set}{n : Nat} -> A -> Vec A n vec {n = ε} x = [] vec {n = _ • n} x = x :: vec x _⊗_ : {A B : Set}{n : Nat} -> Vec (A -> B) n -> Vec A n -> Vec B n ε ⊗ ε = [] (step f • fs) ⊗ (step x • xs) = f x :: (fs ⊗ xs) ε ⊗ (() • _) {- Some proof about _-_ needed... vreverse : {A : Set}{n : Nat} -> Vec A n -> Vec A n vreverse {A}{n} xs = {! !} -- map i f (reverse xs) where i : Nat -> Nat i m = n - m f : Step A op =[ i ]=> Step A f (step x) = {! !} -- step x -}