{-# OPTIONS --safe #-}

open import Algebra.Monus
open import Prelude
open import Algebra

module Data.Weighted.Semimodule {} {S : Type }  (mon : TMAPOM S) where

open TMAPOM mon hiding (commutativeMonoid)

open import Data.Weighted.Definition ⊓-semigroup
open import Data.Weighted.Eliminators ⊓-semigroup
open import Data.Weighted.CommutativeMonoid ⊓-semigroup
open import Data.Weighted.Monad (weight S tapom) renaming (_⋊_ to _⋊′_)
open import Data.Weighted.Functor

module WeightedSemimodule {A : Type a} where
  semimodule : CommutativeMonoid (Weighted A)
  semimodule = commutativeMonoid

  _⋊_ : S  Weighted A  Weighted A
  _⋊_ = _⋊′_

  ⟨*⟩⋊ :  x y z  (x  y)  z  x  (y  z)
  ⟨+⟩⋊ :  x y z  (x  y)  z  (x  z)  (y  z)
  1⋊ : Identityˡ _⋊_ ε

  ⋊∅ :  x  x  ⟅⟆  ⟅⟆

  ⟨*⟩⋊ x y z = sym (⋊-assoc x y z)
  ⟨+⟩⋊ x y z = sym (⊕⟨⋊⟩ x y z)

  1⋊   =  ε⋊
  ⋊∅   x = refl

weightedSemimodule : WeightSemimodule (weight S tapom) (Weighted A)
weightedSemimodule {A = A} = record { WeightedSemimodule {A = A} ; ⋊⟨∪⟩ = ⋊⟨∪⟩ }