open import 1Lab.Univalence.SIP.Record.Base
open import 1Lab.Univalence.SIP.Record.Prop
open import 1Lab.Univalence.SIP.Auto
open import 1Lab.Univalence.SIP
open import 1Lab.Reflection
open import 1Lab.Type.Sigma
open import 1Lab.HLevel
open import 1Lab.Equiv
open import 1Lab.Type
open import Data.List
module 1Lab.Univalence.SIP.Record.Parse where
parseFields : Term → Term → Term → TC (List (InternalField × TypedTm))
parseFields _ _ (con (quote record:) _) = returnTC []
parseFields s h (con (quote _field[_by_]) (ℓ h∷ ℓ₁ h∷ ℓ₁' h∷ R h∷ ι h∷ fs v∷ ℓ₂ h∷ ℓ₂' h∷ S h∷ ι' h∷ sfieldTerm v∷ efieldTerm v∷ []))
= do ℓ ← reduce ℓ
struct-field ← findName sfieldTerm
pres-field ← findName efieldTerm
desc ← newMeta (def (quote Str-term) (ℓ v∷ ℓ₂' v∷ S v∷ []))
tt ← makeAutoStr-term 100 desc
let f : InternalField × TypedTm
f = (structureField struct-field pres-field)
, record { type = def (quote tm→⌜is-univalent⌝) (desc v∷ [])
; term = def (quote tm→is-univalent') (desc v∷ [])
}
rest <- parseFields s h fs
returnTC (f ∷ rest)
parseFields strTerm homTerm (con (quote _axiom[_by_])
(ℓ h∷ ℓ₁ h∷ ℓ₁' h∷ R h∷ ι h∷ fs v∷ ℓ₂ h∷ P h∷ fieldTerm v∷ is-prop v∷ []))
= do struct-field ← findName fieldTerm
let f : InternalField × TypedTm
f = propertyField struct-field
, record { type = def (quote PropHelperType)
(strTerm v∷ homTerm v∷ fs v∷ P v∷ fieldTerm v∷ [])
; term = def (quote derivePropHelper)
(strTerm v∷ homTerm v∷ fs v∷ P v∷ fieldTerm v∷ is-prop v∷ [])
}
rest <- parseFields strTerm homTerm fs
returnTC (f ∷ rest)
parseFields _ _ tm = typeError (termErr tm ∷ strErr " ← This is not a field descriptor!" ∷ [])
parseSpec : Term → TC (Spec TypedTm)
parseSpec (con (quote record-desc) (ℓ h∷ ℓ₁ h∷ ℓ₁' h∷ strTerm v∷ homTerm v∷ fs v∷ [])) =
do fs' ← parseFields strTerm homTerm fs
returnTC λ { .Spec.structure → strTerm
; .Spec.homomorphism → homTerm
; .Spec.fields → fs'
}
parseSpec tm = typeError (termErr tm ∷ strErr " ← This is not an AutoRecord!" ∷ [])