open import 1Lab.Reflection
open import 1Lab.Univalence
open import 1Lab.Type
open import Prim.Extension
open import Prim.HCompU
open import Prim.Kan
import 1Lab.Univalence as U
module 1Lab.Reflection.Univalence where
name-of-glue : Name
unquoteDef name-of-glue = do
  nm ← resetting do
    def nm _ ← reduce (def (quote Glue) (unknown v∷ unknown v∷ []))
      where anything → typeError ("insane: Glue did not reduce to a defined type?\n" ∷ termErr anything ∷ [])
    pure nm
  define-function name-of-glue (clause [] [] (lit (name nm)) ∷ [])
macro
  
  
  unglue : Term → Term → TC ⊤
  unglue x goal = do
    let
      fail : Term → TC ⊤
      fail ty = typeError
        [ "unglue: the argument " , termErr x , " does not have a Glue type. instead, it is\n"
        , "  " , termErr ty
        ]
    ty ← wait-for-type =<< reduce =<< infer-type x
    case ty of λ where
      (def (quote primHComp) (ℓ h∷ _ h∷ φ h∷ s v∷ b v∷ [])) → unify goal
        (def (quote prim^unglueU)
          (unknown h∷ φ h∷ s h∷ def (quote inS) (b v∷ []) h∷ x v∷ []))
      ty@(def a (_ h∷ _ h∷ _ v∷ φ h∷ _)) → case a ≡? name-of-glue of λ where
        (yes _) → do
          wait-for-type φ
          unify goal (def (quote U.unattach) (φ v∷ x v∷ []))
        (no _) → fail ty
      ty → fail ty
{-# DISPLAY unattach _ x = unglue x #-}