\import Algebra.Ring
\import Algebra.Ring.RingHom
\import Paths.Meta

\instance ProductCRing (R S : CRing) : CRing (\Sigma R S)
  | zro => (R.zro, S.zro)
  | + s t => (s.1 R.+ t.1, s.2 S.+ t.2)
  | +-assoc => ext (R.+-assoc, S.+-assoc)
  | +-comm => ext (R.+-comm, S.+-comm)
  | * s t => (s.1 R.* t.1, s.2 S.* t.2)
  | *-assoc => ext (R.*-assoc, S.*-assoc)
  | negative s => (R.negative s.1, S.negative s.2)
  | negative-left => ext (R.negative-left, S.negative-left)
  | ide => (R.ide, S.ide)
  | *-comm => ext (R.*-comm, S.*-comm)
  | ide-left => ext (R.ide-left, S.ide-left)
  | ldistr => ext (R.ldistr, S.ldistr)
  | zro-left => ext (R.zro-left, S.zro-left)
  \where {
    \func proj1 : RingHom (ProductCRing R S) R \cowith
      | func s => s.1
      | func-+ => idp
      | func-* => idp
      | func-ide => idp

    \func proj2 : RingHom (ProductCRing R S) S \cowith
      | func s => s.2
      | func-+ => idp
      | func-* => idp
      | func-ide => idp
  }