12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576{-# OPTIONS --safe --without-K #-}module Reflection.Utils.Args where open import Meta.Preludeopen import Meta.Init open import Data.List using (map; zip)open import Data.Fin using (toℕ)open import Relation.Nullary using (Dec) open import Reflection.AST.Argument.Informationimport Reflection.AST.Argument.Visibility as Vis getVisibility : Arg A → VisibilitygetVisibility (arg (arg-info v _) _) = v unArgs : Args A → List AunArgs = map unArg args : Term → Args Termargs = λ where (var _ xs) → xs (def _ xs) → xs (con _ xs) → xs _ → [] args′ : Term → List Termargs′ = unArgs ∘ args vArgs : Args A → List AvArgs = λ where [] → [] (vArg x ∷ xs) → x ∷ vArgs xs (_ ∷ xs) → vArgs xs argInfo : Arg A → ArgInfoargInfo (arg i _) = i isVisible? : (a : Arg A) → Dec (visibility (argInfo a) ≡ visible)isVisible? a = visibility (argInfo a) Vis.≟ visible isInstance? : (a : Arg A) → Dec (visibility (argInfo a) ≡ instance′)isInstance? a = visibility (argInfo a) Vis.≟ instance′ isHidden? : (a : Arg A) → Dec (visibility (argInfo a) ≡ hidden)isHidden? a = visibility (argInfo a) Vis.≟ hidden remove-iArgs : Args A → Args Aremove-iArgs [] = []remove-iArgs (iArg x ∷ xs) = remove-iArgs xsremove-iArgs (x ∷ xs) = x ∷ remove-iArgs xs hide : Arg A → Arg Ahide = λ where (vArg x) → hArg x (hArg x) → hArg x (iArg x) → iArg x a → a ∀indices⋯ : Args Type → Type → Type∀indices⋯ [] ty = ty∀indices⋯ (i ∷ is) ty = Π[ "_" ∶ hide i ] (∀indices⋯ is ty) apply⋯ : Args Type → Name → Typeapply⋯ is n = def n $ remove-iArgs $ map (λ{ (n , arg i _) → arg i (♯ (length is ∸ suc (toℕ n)))}) (zip (allFin $ length is) is) -- Applying a list of arguments to a term of any shape.apply∗ : Term → Args Term → Termapply∗ f xs = case f of λ where (def n as) → def n (as ++ xs) (con c as) → con c (as ++ xs) (var x as) → var x (as ++ xs) (pat-lam cs as) → pat-lam cs (as ++ xs) (meta x as) → meta x (as ++ xs) f → f