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

open import lib.Basics
open import lib.NType2
open import lib.types.TLevel
open import lib.types.Sigma
open import lib.types.Pi

module lib.types.Groupoid where

record GroupoidStructure {i j} {El : Type i} (Arr : El  El  Type j)
  (_ :  x y  has-level ⟨0⟩ (Arr x y)) : Type (lmax i j) where
  field
    id :  {x}  Arr x x
    inv :  {x y}  Arr x y  Arr y x
    comp :  {x y z}  Arr x y  Arr y z  Arr x z
    unit-l :  {x y} (a : Arr x y)  comp id a == a
    unit-r :  {x y} (a : Arr x y)  comp a id == a
    assoc   :  {x y z w} (a : Arr x y) (b : Arr y z) (c : Arr z w)
               comp (comp a b) c == comp a (comp b c)
    inv-r    :  {x y} (a : Arr x y)  (comp a (inv a)) == id
    inv-l    :  {x y } (a : Arr x y)  (comp (inv a) a) == id

record Groupoid {i j} : Type (lsucc (lmax i j)) where
  constructor groupoid
  field
    El : Type i
    Arr : El  El  Type j
    Arr-level :  x y  has-level ⟨0⟩ (Arr x y)
    groupoid-struct : GroupoidStructure Arr Arr-level