{-# OPTIONS --no-exact-split --safe #-}
module Cubical.Structures.MultiSet where

open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Function
open import Cubical.Foundations.HLevels
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.SIP
open import Cubical.Functions.FunExtEquiv

open import Cubical.Structures.Auto

open import Cubical.Data.Nat
open import Cubical.Data.Sigma

private
  variable
     : Level

module _ (A : Type ) (Aset : isSet A) where

 CountStructure : Type   Type 
 CountStructure X = A  X  

 CountEquivStr = AutoEquivStr CountStructure

 countUnivalentStr : UnivalentStr _ CountEquivStr
 countUnivalentStr = autoUnivalentStr CountStructure

 Count : Type (ℓ-suc )
 Count = TypeWithStr  CountStructure

 MultiSetStructure : Type   Type 
 MultiSetStructure X = X × (A  X  X) × (A  X  )

 MultiSetEquivStr = AutoEquivStr MultiSetStructure

 multiSetUnivalentStr : UnivalentStr _ MultiSetEquivStr
 multiSetUnivalentStr = autoUnivalentStr MultiSetStructure

 MultiSet : Type (ℓ-suc )
 MultiSet = TypeWithStr  MultiSetStructure