{-# OPTIONS --safe --without-K #-} open import Prelude module Generics.Reflection.Connection where open import Utils.Reflection open import Utils.Error as Err open import Generics.Description open import Generics.Recursion open import Generics.Algebra open import Generics.Reflection.Telescope open import Generics.Reflection.Name open import Generics.Reflection.Uncurry open import Generics.Reflection.Recursion private pattern `DataC x y = def₂ (quote DataC) x y pattern `datac a b c d = con₄ (quote datac) a b c d pattern `FoldC x y = def₂ (quote FoldC) x y pattern `IndC x y = def₂ (quote IndC) x y pattern `Algs x y = def₂ (quote Algs) x y pattern `Coalgs x y = def₂ (quote Coalgs) x y pattern `toN = proj (quote (DataC.toN)) pattern `fromN = proj (quote (DataC.fromN)) pattern `fromN-toN = proj (quote (DataC.fromN-toN)) pattern `toN-fromN = proj (quote (DataC.toN-fromN)) pattern `FoldC-equation = proj (quote (FoldC.equation)) pattern `IndC-equation = proj (quote (IndC.equation)) module _ (pars : ℕ) where conToClause : (c : Name) → TC (Telescope × Vars) conToClause c = < forgetTypes , cxtToVars 0 (`refl , `refl) > <$> getConTelescope c pars consToClauses : (cs : Names) → TC (List (Telescope × Name × Vars)) consToClauses [] = ⦇ [] ⦈ consToClauses (c ∷ cs) = do `Γ , (t , p) , args ← conToClause c cls ← consToClauses cs return $ (`Γ , c , (`inl t , `inl p) , args) ∷ ((λ (`Γ , c , (t , p) , args) → `Γ , c , (`inr t , `inr p) , args) <$> cls) module _ (cs : Names) where genFromCons : (Telescope × Name × Vars → Clause) → TC Clauses genFromCons f = map f <$> consToClauses cs genToNT = genFromCons λ where (`Γ , c , (_ , p) , args , _) → `Γ ⊢ vArg `toN ∷ [ vArg p ] `= con c (hUnknowns pars <> args) genFromNT = genFromCons λ where (Γ , c , (t , _) , _ , args) → Γ ⊢ vArg `fromN ∷ [ vArg (con c args) ] `= t genFromN-toNT = genFromCons λ where (Γ , _ , (_ , p) , _) → Γ ⊢ vArg `fromN-toN ∷ [ vArg p ] `= `refl genToN-fromNT = genFromCons λ where (Γ , c , _ , _ , args) → Γ ⊢ vArg `toN-fromN ∷ [ vArg (con c args) ] `= `refl genFoldC-equation = pat-lam₀ <$> genFromCons λ where (Γ , c , (_ , p) , _) → Γ ⊢ vArg `FoldC-equation ∷ vArg p ∷ [] `= `refl genIndC-equation = pat-lam₀ <$> genFromCons λ where (Γ , c , (_ , p) , _) → Γ ⊢ vArg `IndC-equation ∷ vArg p ∷ [] `= `refl genDataCT : (D : DataD) (N : DataT D) → Tactic genDataCT D N hole = do `D ← quoteωTC D `N ← quoteωTC N `Ds ← formatErrorParts [ termErr `D ] `Ns ← formatErrorParts [ termErr `N ] let msg = "<An instance of DataC " <> `Ds <> " " <> `Ns <> ">" dataC ← freshName msg d ← DataToNativeName D N pars , cs ← getDataDefinition d toN ← genToNT pars cs fromN ← genFromNT pars cs fromN-toN ← genFromN-toNT pars cs toN-fromN ← genToN-fromNT pars cs noConstraints $ define (vArg dataC) (`DataC `D `N) (toN <> fromN <> fromN-toN <> toN-fromN) unify hole (def₀ dataC) where open DataD D genFoldCT' : (P : FoldP) (f : FoldT P) → Tactic genFoldCT' P f hole = do `P ← quoteωTC P `f ← quoteωTC f hole ← checkType hole $ `FoldC `P `f d ← FoldPToNativeName P pars , cs ← getDataDefinition d genFoldC-equation pars cs >>= unify hole genFoldCT : (P : FoldP) → Name → Tactic genFoldCT P d hole = do `P ← quoteωTC P `t ← uncurryFoldP P d hole ← checkType hole $ `FoldC `P `t d ← FoldPToNativeName P pars , cs ← getDataDefinition d genFoldC-equation pars cs >>= unify hole genIndCT' : (P : IndP) (f : IndT P) → Tactic genIndCT' P f hole = do `P ← quoteωTC P `f ← quoteωTC f hole ← checkType hole $ `IndC `P `f d ← IndPToNativeName P pars , cs ← getDataDefinition d genIndC-equation pars cs >>= unify hole genIndCT : (P : IndP) → Name → Tactic genIndCT P d hole = do `P ← quoteωTC P `t ← uncurryIndP P d hole ← checkType hole $ `IndC `P `t d ← IndPToNativeName P pars , cs ← getDataDefinition d genIndC-equation pars cs >>= unify hole macro genDataC : (D : DataD) (N : DataT D) → Tactic genDataC = genDataCT genFoldC' : (P : FoldP) (f : FoldT P) → Tactic genFoldC' = genFoldCT' genFoldC : (P : FoldP) → Name → Tactic genFoldC = genFoldCT genIndC' : (P : IndP) (f : IndT P) → Tactic genIndC' = genIndCT' genIndC : (P : IndP) → Name → Tactic genIndC = genIndCT