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

open import lib.Basics
open import lib.types.Group
open import lib.types.Lift
open import lib.groups.Homomorphisms

module lib.groups.Lift where

Lift-group-structure :  {i j} {A : Type i}
   GroupStructure A  GroupStructure (Lift {j = j} A)
Lift-group-structure GS = record
  { ident = lift ident
  ; inv = λ {(lift x)  lift (inv x)}
  ; comp = λ {(lift x) (lift y)  lift (comp x y)}
  ; unitl = λ {(lift y)  ap lift (unitl y)}
  ; unitr = λ {(lift x)  ap lift (unitr x)}
  ; assoc = λ {(lift x) (lift y) (lift z)  ap lift (assoc x y z)}
  ; invr = λ {(lift x)  ap lift (invr x)}
  ; invl = λ {(lift x)  ap lift (invl x)}
  }
  where open GroupStructure GS

Lift-Group :  {i j}  Group i  Group (lmax i j)
Lift-Group {j = j} G = group (Lift {j = j} El) (Lift-level El-level)
                             (Lift-group-structure group-struct)
  where open Group G

lift-hom :  {i j} {G : Group i}  (G →ᴳ Lift-Group {j = j} G)
lift-hom = record {f = lift; pres-comp = λ _ _  idp}

lower-hom :  {i j} {G : Group i}  (Lift-Group {j = j} G →ᴳ G)
lower-hom = record {f = lower; pres-comp = λ _ _  idp}