{-# OPTIONS --without-K --rewriting #-}

open import lib.Base
open import lib.Function
open import lib.PathFunctor
open import lib.PathGroupoid

module lib.path-seq.Concat {i} {A : Type i} where

infixr 80 _∙∙_
_∙∙_ : {a a' a'' : A}
   a =-= a'  a' =-= a''  a =-= a''
_∙∙_ [] t = t
_∙∙_ (p ◃∙ s) t = p ◃∙ (s ∙∙ t)

∙∙-assoc : {a a' a'' a''' : A}
  (s : a =-= a') (t : a' =-= a'') (u : a'' =-= a''')
   (s ∙∙ t) ∙∙ u == s ∙∙ (t ∙∙ u)
∙∙-assoc [] t u = idp
∙∙-assoc (p ◃∙ s) t u = ap (p ◃∙_) (∙∙-assoc s t u)

∙∙-unit-r : {a a' : A} (s : a =-= a')
   s ∙∙ [] == s
∙∙-unit-r [] = idp
∙∙-unit-r (p ◃∙ s) = ap (p ◃∙_) (∙∙-unit-r s)

infixl 80 _∙▹_
_∙▹_ : {a a' a'' : A}
   a =-= a'  a' == a''  a =-= a''
_∙▹_ {a} {a'} {a''} s p = s ∙∙ (p ◃∙ [])

↯-∙∙ : {a a' a'' : A} (s : a =-= a') (t : a' =-= a'')
    (s ∙∙ t) ==  s   t
↯-∙∙ [] t = idp
↯-∙∙ (p ◃∙ []) [] = ! (∙-unit-r p)
↯-∙∙ (p ◃∙ []) (p' ◃∙ t) = idp
↯-∙∙ (p ◃∙ s@(_ ◃∙ _)) t =
  ap  y  p  y) (↯-∙∙ s t) 
  ! (∙-assoc p ( s) ( t))

∙∙-suff=ₛ : {a a' a'' : A} (s : a =-= a') {t₁ t₂ : a' =-= a''} (τ : t₁ =ₛ t₂)
   s ∙∙ t₁ =ₛ s ∙∙ t₂
∙∙-suff=ₛ s {t₁} {t₂} (=ₛ-in e) = =ₛ-in (↯-∙∙ s t₁  ap  p   s  p) e  ! (↯-∙∙ s t₂)) 

∙∙-pref=ₛ : {a a' a'' : A} {s₁ s₂ : a =-= a'} (t : a' =-= a'') (σ : s₁ =ₛ s₂)
   s₁ ∙∙ t =ₛ s₂ ∙∙ t
∙∙-pref=ₛ {s₁ = s₁} {s₂ = s₂} t (=ₛ-in e) = =ₛ-in (↯-∙∙ s₁ t  ap  p  p   t) e  ! (↯-∙∙ s₂ t))