Section MonoidalLaws.
Context {obj : Type} (C : Hom obj).
Context {Eq2_C : Eq2 C} {Id_C : Id_ C} {Cat_C : Cat C}.
Context (bif : binop obj).
Context {Bimap_bif : Bimap C bif}.
Context {AssocR_bif : AssocR C bif}.
Context {AssocL_bif : AssocL C bif}.
(** *** Associators and unitors are isomorphisms *)
(** [assoc_r] and [assoc_l] are mutual inverses. *)
Notation AssocIso :=
(forall a b c, Iso C (assoc_r_ a b c) assoc_l) (only parsing).
(* TODO: should that be a notation? *)
Context (i : obj).
Context {UnitL_bif  : UnitL  C bif i}.
Context {UnitL'_bif : UnitL' C bif i}.
Context {UnitR_bif  : UnitR  C bif i}.
Context {UnitR'_bif : UnitR' C bif i}.
(** *** Naturality *)
Class UnitLNatural : Prop :=
natural_unit_l : forall a b (f : C a b),
bimap (id_ i) f >>> unit_l_ i b ⩯ unit_l_ i a >>> f.
Class UnitL'Natural : Prop :=
natural_unit_l' : forall a b (f : C a b),
unit_l'_ i a >>> bimap (id_ i) f ⩯ f >>> unit_l'_ i b.
(** [unit_l] and [unit_l'] are mutual inverses. *)
Notation UnitLIso :=
(forall a, Iso C (unit_l_ i a) unit_l') (only parsing).

(** [unit_l] is a split epimorphism, [unit_l'] is its section. *)
Corollary unit_l_epi {UnitLIso_C : UnitLIso} : forall a,
unit_l' >>> unit_l ⩯ id_ a.