{-# OPTIONS --without-K --exact-split --safe #-}

open import Fragment.Algebra.Signature

module Fragment.Algebra.Properties where

open import Fragment.Algebra.Algebra
open import Fragment.Algebra.Free

open import Level using (Level)

open import Data.Nat using ()
open import Data.Vec using (Vec; []; _∷_)

private
  variable
    a  : Level

mutual
  map-extend :  {Σ O a n}  {A : Set a}
                Vec (Term Σ A) n
                Vec (Term (Σ  O ) A) n
  map-extend []       = []
  map-extend (x  xs) = extend x  map-extend xs

  extend :  {Σ O}  {A : Set a}
            Term Σ A  Term (Σ  O ) A
  extend (atom x)    = atom x
  extend (term f xs) = term (oldₒ f) (map-extend xs)

forgetₒ :  {Σ O}  Algebra (Σ  O ) {a} {}  Algebra Σ {a} {}
forgetₒ {Σ = Σ} A = record { ∥_∥/≈           =  A ∥/≈
                           ; ∥_∥/≈-isAlgebra = forget-isAlgebra
                           }
  where forget-⟦_⟧ : Interpretation Σ  A ∥/≈
        forget-⟦ f  x = A  oldₒ f  x

        forget-⟦⟧-cong : Congruence Σ  A ∥/≈ forget-⟦_⟧
        forget-⟦⟧-cong f x = (A  oldₒ f ⟧-cong) x

        forget-isAlgebra : IsAlgebra Σ  A ∥/≈
        forget-isAlgebra = record { ⟦_⟧     = forget-⟦_⟧
                                  ; ⟦⟧-cong = forget-⟦⟧-cong
                                  }