Tealeaves.Adapters.PolyToMono.Categorical.DecoratedMonad

From Tealeaves Require Export
  Classes.Categorical.DecoratedTraversableMonad
  Classes.Categorical.DecoratedTraversableMonadPoly
  Adapters.PolyToMono.Categorical.DecoratedFunctor.

Module ToMono1.
  Section ctx.

    Context
      {T: Type Type Type}
      `{DecoratedMonadPoly T}.

    Import DecoratedFunctor.ToMono1.

    #[export] Instance Bmap_Monad_Hom:
       (B1 B2: Type) (f: B1 B2),
        Monad_Hom (T B1) (T B2) (fun V ⇒ @bmap T _ V B1 B2 f).
    Proof.
      intros.
      constructor.
      - typeclasses eauto.
      - typeclasses eauto.
      - unfold bmap.
        unfold_ops @Map2_2.
        typeclasses eauto.
      - intros.
        unfold bmap.
        unfold_ops @Map2_2.
        rewrite dmp_map_ret.
        reflexivity.
      - intros.
        unfold bmap.
        unfold_ops @Map2_2.
        rewrite dmp_map_join.
        reassociateon right.
        setoid_rewrite (fun2_map2_map21 (B1 := B1) (F := T)).
        reflexivity.
    Qed.

    #[export] Instance DecoratedMonad_PolyVar:
       (B: Type), DecoratedMonad (list B) (T B).
    Proof.
      constructor.
      - typeclasses eauto.
      - typeclasses eauto.
      - typeclasses eauto.
      - intros.
        unfold_ops @VDec.
        reassociateon left.
        rewrite dmp_dec_ret.
        reassociate <- on left.
        rewrite dmp_map_ret.
        reflexivity.
      - intros.
        unfold_ops @VDec.
        reassociateon left.
        rewrite dmp_dec_join.
        reassociate <- on left.
        reassociate <- on left.
        rewrite dmp_map_join.
        reassociatenear (map2 id (shift2 map_snd decp)).
        rewrite fun2_map_map.
        reassociate <- on right.
        repeat reassociateon right.
        repeat reassociateon left.
        fequal.
        repeat reassociate <- on right.
        setoid_rewrite (fun2_map21_map2 (F := T)).
        unfold shift.
        unfold strength.
        unfold_ops @Map2_1.
        reassociateon right.
        rewrite polydecnat.
        reassociate <- on right.
        setoid_rewrite (fun2_map_map (F := T)).
        rewrite fun_map_id.
        change (?x id) with x.
        fequal.
        fequal.
        unfold shift.
        unfold map.
        unfold strength.
        unfold compose.
        ext [l t].
        cbn.
        compose near (decp t) on right.
        rewrite fun2_map_map.
        compose near (decp t) on right.
        rewrite fun2_map_map.
        change (?x id) with x.
        repeat change (id ?x) with x.
        change (id ?x) with x.
        unfold shift2, strength2, compose.
        compose near (decp t) on left.
        rewrite fun2_map_map.
        compose near (decp t) on left.
        rewrite fun2_map_map.
        fequal.
        + now ext [l' b].
        + rewrite fun_map_id.
          reflexivity.
    Qed.

  End ctx.
End ToMono1.