/caterwaul/Category/Op/category
Copy path to clipboardTODO: This currently forces 𝒱 = 𝐒𝐞𝐭, because of the Hom instance. It would
be good to abstract that via composition with some symmetric category, like
category.product (hom.map a b) flip.
Source
{-|
**TODO**: This currently forces 𝒱 = 𝐒𝐞𝐭, because of the Hom instance. It would
be good to abstract that via composition with some symmetric category, like
`category.product (hom.map a b) flip`.
-}
let kCat = ../Cat/semigroupal
let vObject = Type
let v =
      ../Monoidal/Cartesian/extractMonoidal
        kCat
        Type
        vObject
        ../Set/monoidal/cartesian
in  λ(object : Kind) →
    λ(cat : ../Kind kCat vObject object) →
    λ(category : ../Type object v cat) →
      let Op = ./Kind vObject object cat
      in    { unit = category.unit
            , product =
                λ(a : { _1 : object, _2 : object }) →
                λ ( p
                  : ∀(r : Type) →
                    ( ∀(z : object) →
                      Op.arrow { _1 = z, _2 = a._2 } →
                      Op.arrow { _1 = a._1, _2 = z } →
                        r
                    ) →
                      r
                  ) →
                  category.product
                    { _1 = a._2, _2 = a._1 }
                    ( λ(r : Type) →
                      λ ( arrowsOut
                        : ∀(z : object) →
                          cat.arrow { _1 = z, _2 = a._1 } →
                          cat.arrow { _1 = a._2, _2 = z } →
                            r
                        ) →
                        p
                          r
                          ( λ(z : object) →
                            λ(f : Op.arrow { _1 = z, _2 = a._2 }) →
                            λ(g : Op.arrow { _1 = a._1, _2 = z }) →
                              arrowsOut z g f
                          )
                    )
            , hom.map
              =
                λ(a : { _1 : object, _2 : object }) →
                λ(b : { _1 : object, _2 : object }) →
                λ ( f
                  : { _1 : cat.arrow { _1 = a._1, _2 = b._1 }
                    , _2 : cat.arrow { _1 = b._2, _2 = a._2 }
                    }
                  ) →
                  category.hom.map
                    { _1 = a._2, _2 = a._1 }
                    { _1 = b._2, _2 = b._1 }
                    { _1 = f._2, _2 = f._1 }
            }
          : ../Type object v Op