\begin{code}
{-# OPTIONS --safe #-}

open import Algebra hiding (RightAction)
open import Prelude hiding (∣_∣; ∥_∥)

module Algebra.MonoidActionCategory {M : Type} (mon : Monoid M) where

open Monoid mon

record Action (A : Type a) : Type a where
  infixl 5 _·_
  field
    _·_ : A  M  A
    act :  x y z  (x · y) · z  x · (y  z)
    ε· :  x  x · ε  x

open Action  ... 

record Ob : Type₁ where
  constructor ∥_∥
  field
    ∣_∣ : Type
     acts  : Action ∣_∣
open Ob

_⟶_ : Ob  Ob  Type _
X  Y = Σ[ f   X  →′  Y  ] ×  x y  f x · y  f (x · y)

private variable X Y Z : Ob

id′ : X  X
id′ .fst = id
id′ .snd x y = refl

_⊚_ : (Y  Z)  (X  Y)  X  Z
(f  g) .fst = f .fst  g .fst
(f  g) .snd x y = f .snd (g .fst x) y ; cong (f .fst) (g .snd x y)

instance
  selfAction : Action M 
  selfAction ._·_ = _∙_
  selfAction .act = assoc
  selfAction .ε· = ∙ε

Rep : Ob  Type
Rep X =  M   X

open import Cubical.Data.Sigma using (Σ≡Prop)

Rep-iso : isSet  X  
\end{code}
%<*rep-iso>
\begin{code}
  ( M   X)   X 
\end{code}
%</rep-iso>
\begin{code}
Rep-iso _ .fun (f , _) = f ε
Rep-iso _ .inv x .fst y = x · y
Rep-iso _ .inv x .snd = act x
Rep-iso _ .rightInv = ε· 
Rep-iso {X = X} isSetX .leftInv  (f , p) =
  Σ≡Prop
     _  isPropΠ λ _  isPropΠ λ _  isSetX  _ _ )
    (funExt λ x  p ε x ; cong f (ε∙ x))
\end{code}