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

module Pi.Coxeter.LehmerSnEquiv where

open import lib.Base
open import lib.NType
open import lib.NType2
open import lib.Equivalence
open import lib.PathGroupoid
open import lib.types.Fin
open import lib.types.List

open import Pi.Lehmer.Lehmer
open import Pi.Lehmer.LehmerFinEquiv
open import Pi.Coxeter.LehmerCoxeterEquiv
open import Pi.Coxeter.Sn
open import Pi.Coxeter.Coxeter

Lehmer≃Coxeter : {n : } ->  Lehmer n  Sn n
Lehmer≃Coxeter = equiv f g f-g g-f
    where
    f : {n : } -> Lehmer n  Sn n
    f {O} CanZ = q[ nil ]
    f {S n} = q[_]  immersion

    g-q : {n : } ->  List (Fin n)  Lehmer n
    g-q = immersion⁻¹

    g-rel :  {n : } ->  {m1 m2 : List (Fin n)}  m1 ≈* m2  g-q m1 == g-q m2
    g-rel = immersion⁻¹-respects≈

    g :  {n : } -> Sn n  Lehmer n
    g {n} = SetQuot-rec {B = Lehmer n} g-q g-rel

    f-g-q : {n : } -> (m : List (Fin n))  f (g q[ m ]) == q[ m ]
    f-g-q {O} nil = idp
    f-g-q {S n} m = quot-rel (immersion∘immersion⁻¹ m)

    f-g :  {n : } -> (l : Sn n)  f (g l) == l
    f-g = SetQuot-elim {P = λ l  f (g l) == l} f-g-q  _  prop-has-all-paths-↓)

    g-f : {n : } ->  (cl : Lehmer n)  g (f cl) == cl
    g-f {O} CanZ = idp
    g-f {S n} cl = immersion⁻¹∘immersion cl