Tealeaves.Classes.Categorical.DecoratedTraversableMonadPoly

From Tealeaves Require Export
  Classes.Categorical.DecoratedFunctorPoly
  Classes.Categorical.TraversableFunctor2
  Classes.Categorical.DecoratedMonadPoly
  Classes.Categorical.TraversableMonad2
  Classes.Categorical.ApplicativeCommutativeIdempotent
  Classes.Categorical.Monad
  Classes.Categorical.DecoratedTraversableFunctorPoly
  Functors.List
  Functors.Writer.

#[local] Generalizable Variables T F G W A B C.

Section laws.

  Context (T: Type Type Type).

  Context
    `{Map2 T} `{DecoratePoly T} `{ApplicativeDist2 T}
    `{ B, Return (T B)}
    `{ B, Join (T B)}.

  Definition decpoly_ret: Prop :=
     (B V: Type),
      decp ret (T := T B) (A := V) =
        ret (T := T (Z B)) (A := L B V) ret (T := prod (list B)).

  Definition decpoly_join: Prop :=
     (B V: Type),
      decp join (T := T B) (A := V) =
        join (T := T (Z B)) map2 id (shift2 map_snd decp)
           decp (B := B) (V := T B V).

  Definition dist2_join `{Applicative G}: Prop :=
     (B V: Type),
      dist2 join (T := T (G B)) (A := (G V)) =
        map (F := G) (join (T := T B))
          dist2 (T := T) (G := G)
          map2 (F := T) id (dist2).

  Definition dist2_ret `{Applicative G}: Prop :=
     (B V: Type),
      dist2 ret (T := T (G B)) (A := G V) =
        map (F := G) (ret (T := T B) (A := V)).

  Definition dist2_decpoly_ci
     `{ApplicativeCommutativeIdempotent G}: Prop :=
     (B V: Type),
      dist2 (G := G) map2 (dist Z G) (dist2 (T := L)) (decp (B := G B) (V := G V)) =
        map (F := G) (decp (B := B) (V := V)) dist2 (T := T) (G := G).

End laws.

Decorated-traversable monads