Raw File
module Tick

type tick (n:Ghost.erased nat) (a:Type) : Type =
| Tick : a -> tick n a


let pure (#a:Type) (x:a) : tick 0 a = Tick x

let app (#n #m:Ghost.erased nat) (#a #b:Type) (Tick f:tick n (a -> b)) (Tick x:tick m a)
: tick (n + m + 1) b
= Tick (f x)

module L = FStar.List.Tot

let rec append (#a:Type) (xs ys:list a)
: tick (L.length xs) (list a)
= match xs with
  | []    -> pure ys
  | x::xs -> pure (Cons x) `app` append xs ys
back to top