open import Algebra
open import Prelude

module Algebra.IndexedMonoid {โ„“โ‚ โ„“โ‚‚} {๐‘† : Type โ„“โ‚} (mon : Monoid ๐‘†) (U : ๐‘† โ†’ Type โ„“โ‚‚) where

open Monoid mon

private
  variable x y z : ๐‘†


record MonoidCongruent : Type (โ„“โ‚ โ„“โŠ” โ„“โ‚‚) where
  field
    โ“”   : U ฮต
    _โŠ™_ : U x โ†’ U y โ†’ U (x โˆ™ y)
  
    โ“”โŠ™ : (xs : U x) โ†’ โ“” โŠ™ xs โ‰ก[ i โ‰” U (ฮตโˆ™ x i) ]โ‰ก xs
    โŠ™โ“” : (xs : U x) โ†’ xs โŠ™ โ“” โ‰ก[ i โ‰” U (โˆ™ฮต x i) ]โ‰ก xs
    โŠ™-assoc : (xs : U x) (ys : U y) (zs : U z) โ†’ (xs โŠ™ ys) โŠ™ zs โ‰ก[ i โ‰” U (assoc x y z i) ]โ‰ก xs โŠ™ (ys โŠ™ zs)

open import Data.Sigma.Properties

record ComonoidCongruent : Type (โ„“โ‚ โ„“โŠ” โ„“โ‚‚) where
  field
    โŠ™แต’ : U (x โˆ™ y) โ†’ U x ร— U y

  โŠ™หก : U (x โˆ™ y) โ†’ U x
  โŠ™หก = fst โˆ˜ โŠ™แต’

  โŠ™สณ : U (x โˆ™ y) โ†’ U y
  โŠ™สณ = snd โˆ˜ โŠ™แต’
  
  field
    โ“”โŠ™สณ : (xs : U (ฮต โˆ™ x)) โ†’ xs โ‰ก[ i โ‰” U (ฮตโˆ™ x i) ]โ‰ก โŠ™สณ xs
    โŠ™โ“”หก : (xs : U (x โˆ™ ฮต)) โ†’ xs โ‰ก[ i โ‰” U (โˆ™ฮต x i) ]โ‰ก โŠ™หก xs
    โŠ™แต’-assoc : reassoc .fun โˆ˜ mapโ‚ โŠ™แต’ โˆ˜ โŠ™แต’ โ‰ก[ i โ‰” (U (assoc x y z i) โ†’ U x ร— U y ร— U z) ]โ‰ก mapโ‚‚ โŠ™แต’ โˆ˜ โŠ™แต’