import Syntax.Simple.Signature as S
import Syntax.BiTyped.Signature as B
module Theory.ModeDecoration {SD : S.SigD} (BD : B.SigD SD) where
open import Prelude
open B SD
open import Syntax.Typed.Raw.Functor SD as T
open import Syntax.BiTyped.Pre.Generalised.Functor SD as P
open import Theory.Erasure
open import Syntax.Typed.Raw.Term (erase BD)
open import Syntax.BiTyped.Pre.Term BD
open import Syntax.BiTyped.Pre.Generalised.Term BD
open import Theory.Pre.Term BD
private variable
n Ξ : ℕ
adjustMode : (d : Mode) {r : Raw n}
→ ∃[ v ] ∃[ d' ] Pre? v true d' r
→ ∃[ v ] ∃[ e ] Pre? v e d r
adjustMode Chk (_ , Chk , p) = _ , _ , p
adjustMode Chk (_ , Syn , p) = _ , _ , p ↑
adjustMode Syn (_ , Chk , p) = _ , _ , ?∋ p
adjustMode Syn (_ , Syn , p) = _ , _ , p
mutual
decorate' : (r : Raw n) → ∃[ v ] ∃[ d ] Pre? v true d r
decorate' (` i) = _ , _ , ` i
decorate' (A ∋ r) with adjustMode Chk (decorate' r)
... | _ , _ , p = _ , _ , A ∋ p
decorate' (op (i , rs)) with decorateᶜ (BD .ar i) rs
... | _ , _ , p = _ , _ , op (refl , p)
decorateᶜ
: (D : OpD) (rs : T.⟦ eraseᶜ D ⟧ᶜ Raw n)
→ ∃[ v ] ∃[ d ] P.⟦ D ⟧ᶜ Raw Pre? v d rs
decorateᶜ (ι d _ Ds) rs with decorateᵃˢ Ds rs
... | vs , v , a , p = v , d , vs , a , refl , p
decorateᵃˢ
: (Ds : ArgsD Ξ) (rs : T.⟦ eraseᵃˢ Ds ⟧ᵃˢ Raw n)
→ ∃[ vs ] ∃[ v ] And (toList vs) v × P.⟦ Ds ⟧ᵃˢ Raw Pre? vs rs
decorateᵃˢ [] _ = _ , _ , nil , tt
decorateᵃˢ ((Δ ⊢[ d ] _) ∷ Ds) (r , rs)
with adjustMode d (decorate' r) | decorateᵃˢ Ds rs
... | false , _ , p | vs , v , _ , q = false ∷ vs , false , hd , (_ , p) , q
... | true , _ , p | vs , v , a , q = true ∷ vs , v , tl a , (_ , p) , q
decorate? : (d : Mode) (r : Raw n) → ∃[ v ] ∃[ e ] Pre? v e d r
decorate? d = adjustMode d ∘ decorate'
decorate : (d : Mode) (r : Raw n) → Dec (Pre d r)
decorate d r with decorate? d r
... | false , _ , p = no (to¬Pre p)
... | true , _ , p = yes (toPre p)