Copy path to clipboardSource
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 = ../Op/Kind vObject object cat
      let opCategory = ../Op/category object cat category
      let Dagger = ./Kind object cat
      in    { unit =
                λ(a : object) →
                  { to = category.unit a, from = opCategory.unit a }
            , product =
                λ(a : { _1 : object, _2 : object }) →
                λ ( p
                  : ∀(r : Type) →
                    ( ∀(z : object) →
                      Dagger.arrow { _1 = z, _2 = a._2 } →
                      Dagger.arrow { _1 = a._1, _2 = z } →
                        r
                    ) →
                      r
                  ) →
                  { to =
                      category.product
                        a
                        ( λ(r : Type) →
                          λ ( arrowsOut
                            : ∀(z : object) →
                              cat.arrow { _1 = z, _2 = a._2 } →
                              cat.arrow { _1 = a._1, _2 = z } →
                                r
                            ) →
                            p
                              r
                              ( λ(z : object) →
                                λ(f : Dagger.arrow { _1 = z, _2 = a._2 }) →
                                λ(g : Dagger.arrow { _1 = a._1, _2 = z }) →
                                  arrowsOut z f.to g.to
                              )
                        )
                  , from =
                      opCategory.product
                        a
                        ( λ(r : Type) →
                          λ ( arrowsOut
                            : ∀(z : object) →
                              op.arrow { _1 = z, _2 = a._2 } →
                              op.arrow { _1 = a._1, _2 = z } →
                                r
                            ) →
                            p
                              r
                              ( λ(z : object) →
                                λ(f : Dagger.arrow { _1 = z, _2 = a._2 }) →
                                λ(g : Dagger.arrow { _1 = a._1, _2 = z }) →
                                  arrowsOut z f.from g.from
                              )
                        )
                  }
            , hom.map
              =
                λ(a : { _1 : object, _2 : object }) →
                λ(b : { _1 : object, _2 : object }) →
                λ ( fn
                  : { _1 : Dagger.arrow { _1 = b._1, _2 = a._1 }
                    , _2 : Dagger.arrow { _1 = a._2, _2 = b._2 }
                    }
                  ) →
                λ(f : Dagger.arrow a) →
                  { to =
                      category.hom.map a b { _1 = fn._1.to, _2 = fn._2.to } f.to
                  , from =
                      opCategory.hom.map
                        a
                        b
                        { _1 = fn._1.from, _2 = fn._2.from }
                        f.from
                  }
            }
          : ../Type object v Dagger