forked from agda/agda-stdlib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTraversal.agda
132 lines (106 loc) · 4.97 KB
/
Traversal.agda
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
------------------------------------------------------------------------
-- The Agda standard library
--
-- de Bruijn-aware generic traversal of reflected terms.
------------------------------------------------------------------------
{-# OPTIONS --cubical-compatible --safe #-}
open import Effect.Applicative using (RawApplicative)
module Reflection.AST.Traversal
{F : Set → Set} (AppF : RawApplicative F) where
open import Data.Nat using (ℕ; zero; suc; _+_)
open import Data.List.Base using (List; []; _∷_; _++_; reverse; length)
open import Data.Product.Base using (_×_; _,_)
open import Data.String using (String)
open import Function.Base using (_∘_)
open import Reflection hiding (pure)
open RawApplicative AppF
------------------------------------------------------------------------
-- Context representation
-- Track both number of variables and actual context, to avoid having to
-- compute the length of the context everytime it's needed.
record Cxt : Set where
constructor _,_
pattern
field
len : ℕ
context : List (String × Arg Term)
private
_∷cxt_ : String × Arg Term → Cxt → Cxt
e ∷cxt (n , Γ) = (suc n , e ∷ Γ)
_++cxt_ : List (String × Arg Term) → Cxt → Cxt
es ++cxt (n , Γ) = (length es + n , es ++ Γ)
------------------------------------------------------------------------
-- Actions
Action : Set → Set
Action A = Cxt → A → F A
-- A traversal gets to operate on variables, metas, and names.
record Actions : Set where
field
onVar : Action ℕ
onMeta : Action Meta
onCon : Action Name
onDef : Action Name
-- Default action: do nothing.
defaultActions : Actions
defaultActions .Actions.onVar _ = pure
defaultActions .Actions.onMeta _ = pure
defaultActions .Actions.onCon _ = pure
defaultActions .Actions.onDef _ = pure
------------------------------------------------------------------------
-- Traversal functions
module _ (actions : Actions) where
open Actions actions
traverseTerm : Action Term
traverseSort : Action Sort
traversePattern : Action Pattern
traverseArgs : Action (List (Arg Term))
traverseArg : Action (Arg Term)
traversePats : Action (List (Arg Pattern))
traverseAbs : Arg Term → Action (Abs Term)
traverseClauses : Action Clauses
traverseClause : Action Clause
traverseTel : Action (List (String × Arg Term))
traverseTerm Γ (var x args) = var <$> onVar Γ x ⊛ traverseArgs Γ args
traverseTerm Γ (con c args) = con <$> onCon Γ c ⊛ traverseArgs Γ args
traverseTerm Γ (def f args) = def <$> onDef Γ f ⊛ traverseArgs Γ args
traverseTerm Γ (pat-lam cs args) = pat-lam <$> traverseClauses Γ cs ⊛ traverseArgs Γ args
traverseTerm Γ (pi a b) = pi <$> traverseArg Γ a ⊛ traverseAbs a Γ b
traverseTerm Γ (agda-sort s) = agda-sort <$> traverseSort Γ s
traverseTerm Γ (meta x args) = meta <$> onMeta Γ x ⊛ traverseArgs Γ args
traverseTerm Γ t@(lit _) = pure t
traverseTerm Γ t@unknown = pure t
traverseTerm Γ (lam v t) = lam v <$> traverseAbs (arg (arg-info v m) unknown) Γ t
where
m = defaultModality
traverseArg Γ (arg i t) = arg i <$> traverseTerm Γ t
traverseArgs Γ [] = pure []
traverseArgs Γ (a ∷ as) = _∷_ <$> traverseArg Γ a ⊛ traverseArgs Γ as
traverseAbs ty Γ (abs x t) = abs x <$> traverseTerm ((x , ty) ∷cxt Γ) t
traverseClauses Γ [] = pure []
traverseClauses Γ (c ∷ cs) = _∷_ <$> traverseClause Γ c ⊛ traverseClauses Γ cs
traverseClause Γ (Clause.clause tel ps t) =
Clause.clause <$> traverseTel Γ tel
⊛ traversePats Γ′ ps
⊛ traverseTerm Γ′ t
where Γ′ = reverse tel ++cxt Γ
traverseClause Γ (Clause.absurd-clause tel ps) =
Clause.absurd-clause <$> traverseTel Γ tel
⊛ traversePats Γ′ ps
where Γ′ = reverse tel ++cxt Γ
traverseTel Γ [] = pure []
traverseTel Γ ((x , ty) ∷ tel) =
_∷_ ∘ (x ,_) <$> traverseArg Γ ty ⊛ traverseTel ((x , ty) ∷cxt Γ) tel
traverseSort Γ (Sort.set t) = Sort.set <$> traverseTerm Γ t
traverseSort Γ t@(Sort.lit _) = pure t
traverseSort Γ (Sort.prop t) = Sort.prop <$> traverseTerm Γ t
traverseSort Γ t@(Sort.propLit _) = pure t
traverseSort Γ t@(Sort.inf _) = pure t
traverseSort Γ [email protected] = pure t
traversePattern Γ (Pattern.con c ps) = Pattern.con <$> onCon Γ c ⊛ traversePats Γ ps
traversePattern Γ (Pattern.dot t) = Pattern.dot <$> traverseTerm Γ t
traversePattern Γ (Pattern.var x) = Pattern.var <$> onVar Γ x
traversePattern Γ p@(Pattern.lit _) = pure p
traversePattern Γ p@(Pattern.proj _) = pure p
traversePattern Γ (Pattern.absurd x) = Pattern.absurd <$> onVar Γ x
traversePats Γ [] = pure []
traversePats Γ (arg i p ∷ ps) = _∷_ ∘ arg i <$> traversePattern Γ p ⊛ traversePats Γ ps