{-# OPTIONS --without-K --sized-types --safe #-}

module GlobSet.BiInvertible.Core where

open import GlobSet
open import GlobSet.Composition

record BiInvertible {a : Level}
                    (i : Size)
                    {G : GlobSet a i}
                    (c : Composable i G)
                    (j : Size< i)
                    {x y : cells G}
                    (f : cells (morphisms G j x y)) : Set (suc a)

record BiInvertibleCell {a : Level}
                        (i : Size)
                        {G : GlobSet a i}
                        (c : Composable i G)
                        (j : Size< i)
                        (x y : cells G) : Set (suc a) where
  coinductive
  field
    cell : cells (morphisms G j x y)
    biInv : BiInvertible i c j cell

record BiInvertible {a} i {G} c j {x} {y} f where
  coinductive
  field
    f* : cells (morphisms G j y x)
    *f : cells (morphisms G j y x)
    fR : (k : Size< j)  BiInvertibleCell j (compHigher c j x x) k (comp1 c f f*) (id c j x)
    fL : (k : Size< j)  BiInvertibleCell j (compHigher c j y y) k (comp1 c *f f) (id c j y)

open BiInvertibleCell public
open BiInvertible public