{-# OPTIONS --cubical-compatible --safe #-}

module Algebra.Cost.Bundles where

open import Algebra.Core
open import Algebra.Cost.Structures
open import Relation.Binary using (Rel; Preorder; _Preserves_⟶_; _Preserves₂_⟶_⟶_)
open import Relation.Binary.PropositionalEquality using (_≡_; resp₂)
open import Level using (0ℓ)


record CostMonoid : Set₁ where
  infixl 6 _+_

  field
    ℂ            : Set
    zero         : ℂ
    _+_          : Op₂ ℂ
    _≤_          : Rel ℂ 0ℓ
    isCostMonoid : IsCostMonoid ℂ zero _+_ _≤_

  open IsCostMonoid isCostMonoid public

  ≤-preorder : Preorder 0ℓ 0ℓ 0ℓ
  Preorder.Carrier ≤-preorder = ℂ
  Preorder._≈_ ≤-preorder = _≡_
  Preorder._≲_ ≤-preorder = _≤_
  Preorder.isPreorder ≤-preorder = isPreorder

  module ≤-Reasoning where
    open import Relation.Binary.Reasoning.Preorder ≤-preorder public


record ParCostMonoid : Set₁ where
  infixl 7 _⊗_
  infixl 6 _⊕_

  field
    ℂ               : Set
    𝟘               : ℂ
    _⊕_             : Op₂ ℂ
    _⊗_             : Op₂ ℂ
    _≤_             : Rel ℂ 0ℓ
    isParCostMonoid : IsParCostMonoid ℂ 𝟘 _⊕_ _⊗_ _≤_

  open IsParCostMonoid isParCostMonoid public

  costMonoid : CostMonoid
  costMonoid = record
    { ℂ = ℂ
    ; _+_ = _⊕_
    ; zero = 𝟘
    ; _≤_ = _≤_
    ; isCostMonoid = record
      { isMonoid = isMonoid
      ; isPreorder = isPreorder
      ; isMonotone = isMonotone-⊕
      }
    }

  ≤-preorder : Preorder 0ℓ 0ℓ 0ℓ
  Preorder.Carrier ≤-preorder = ℂ
  Preorder._≈_ ≤-preorder = _≡_
  Preorder._≲_ ≤-preorder = _≤_
  Preorder.isPreorder ≤-preorder = isPreorder

  module ≤-Reasoning where
    open import Relation.Binary.Reasoning.Preorder ≤-preorder public