{-# OPTIONS --without-K --safe #-}

-- Bundled version of Monoidal Category
module Categories.Category.Monoidal.Bundle where

open import Level

open import Categories.Category.Core using (Category)
open import Categories.Category.Monoidal.Core using (Monoidal)
open import Categories.Category.Monoidal.Properties using (monoidal-Op)
open import Categories.Category.Monoidal.Braided using (Braided)
open import Categories.Category.Monoidal.Braided.Properties using (braided-Op)
open import Categories.Category.Monoidal.Symmetric using (Symmetric)
open import Categories.Category.Monoidal.Symmetric.Properties using (symmetric-Op)

record MonoidalCategory o  e : Set (suc (o    e)) where
  field
    U        : Category o  e
    monoidal : Monoidal U

  open Category U hiding (op) public
  open Monoidal monoidal public

  op : MonoidalCategory o  e
  op = record { monoidal = monoidal-Op monoidal }

record BraidedMonoidalCategory o  e : Set (suc (o    e)) where
  field
    U         : Category o  e
    monoidal  : Monoidal U
    braided   : Braided monoidal

  monoidalCategory : MonoidalCategory o  e
  monoidalCategory = record { monoidal = monoidal }

  open Category U hiding (op) public
  open Braided braided public

  op : BraidedMonoidalCategory o  e
  op = record { braided = braided-Op braided }

record SymmetricMonoidalCategory o  e : Set (suc (o    e)) where
  field
    U         : Category o  e
    monoidal  : Monoidal U
    symmetric : Symmetric monoidal

  open Category U hiding (op) public
  open Symmetric symmetric public

  braidedMonoidalCategory : BraidedMonoidalCategory o  e
  braidedMonoidalCategory = record { braided = braided }

  open BraidedMonoidalCategory braidedMonoidalCategory public
    using (monoidalCategory)

  op : SymmetricMonoidalCategory o  e
  op = record { symmetric = symmetric-Op symmetric }