module Core.Var import Core.Context import Core.Thinning -- Variables ------------------------------------------------------------------- data IsVar : Nat -> Context -> Type where Here : IsVar 0 (sx :< n) There : IsVar k sx -> IsVar (S k) (sx :< n) export record Var (sx : Context) where constructor MakeVar index : Nat 0 prf : IsVar index sx %name IsVar prf %name Var i, j, k -- Constructors ---------------------------------------------------------------- export here : Var (sx :< n) here = MakeVar 0 Here export there : Var sx -> Var (sx :< n) there (MakeVar index prf) = MakeVar (S index) (There prf) -- Views ----------------------------------------------------------------------- namespace View public export data View : Var sx -> Type where Here : View Core.Var.here There : (i : Var sx) -> View (there i) %name View.View view export view : (i : Var sx) -> View i view (MakeVar 0 Here) = Here view (MakeVar (S k) (There prf)) = There (MakeVar k prf) -- Operations ------------------------------------------------------------------ doWkn : Var sx -> {0 thin : sx `Thins` sy} -> View thin -> Var sy doWkn i (Id sy) = i doWkn i (Drop thin n) = there $ doWkn i (view thin) doWkn (MakeVar 0 Here) (Keep thin n _) = here doWkn (MakeVar (S k) (There prf)) (Keep thin n _) = there $ doWkn (MakeVar k prf) (view thin) export wkn : Var sx -> sx `Thins` sy -> Var sy wkn i thin = doWkn i (view thin)