-----------------------------------------------------------------------------
-- |
-- Module      :  Control.Plumbers.Monad
-- Copyright   :  (c) 2012 Michael Sloan 
-- License     :  BSD-style (see the LICENSE file)
-- Maintainer  :  Michael Sloan <mgsloan@gmail.com>
-- Stability   :  experimental
-- Portability :  GHC only
--
-- This module contains the plumbing variants of monad operators.
--
-----------------------------------------------------------------------------
module Control.Plumbers.Monad where

import Control.Plumbers.TH (implementPlumbers)
import Control.Plumbers.Specs (rbindSpec, lbindSpec, flbindSpec, frbindSpec)

$(implementPlumbers rbindSpec)
infixr 9 >=^, >=<, >=>, >=&, >=*
infixr 9 >=^^, >=^<, >=^>, >=^&, >=^*, >=<^, >=<<, >=<>, >=<&, >=<*, >=>^, >=><, >=>>, >=>&, >=>*, >=&^, >=&<, >=&>, >=&&, >=&*, >=*^, >=*<, >=*>, >=*&, >=**
infixr 9 >=^^^, >=^^<, >=^^>, >=^^&, >=^^*, >=^<^, >=^<<, >=^<>, >=^<&, >=^<*, >=^>^, >=^><, >=^>>, >=^>&, >=^>*, >=^&^, >=^&<, >=^&>, >=^&&, >=^&*, >=^*^, >=^*<, >=^*>, >=^*&, >=^**, >=<^^, >=<^<, >=<^>, >=<^&, >=<^*, >=<<^, >=<<<, >=<<>, >=<<&, >=<<*, >=<>^, >=<><, >=<>>, >=<>&, >=<>*, >=<&^, >=<&<, >=<&>, >=<&&, >=<&*, >=<*^, >=<*<, >=<*>, >=<*&, >=<**, >=>^^, >=>^<, >=>^>, >=>^&, >=>^*, >=><^, >=><<, >=><>, >=><&, >=><*, >=>>^, >=>><, >=>>>, >=>>&, >=>>*, >=>&^, >=>&<, >=>&>, >=>&&, >=>&*, >=>*^, >=>*<, >=>*>, >=>*&, >=>**, >=&^^, >=&^<, >=&^>, >=&^&, >=&^*, >=&<^, >=&<<, >=&<>, >=&<&, >=&<*, >=&>^, >=&><, >=&>>, >=&>&, >=&>*, >=&&^, >=&&<, >=&&>, >=&&&, >=&&*, >=&*^, >=&*<, >=&*>, >=&*&, >=&**, >=*^^, >=*^<, >=*^>, >=*^&, >=*^*, >=*<^, >=*<<, >=*<>, >=*<&, >=*<*, >=*>^, >=*><, >=*>>, >=*>&, >=*>*, >=*&^, >=*&<, >=*&>, >=*&&, >=*&*, >=**^, >=**<, >=**>, >=**&, >=***

$(implementPlumbers lbindSpec)
infixr 9 <=^, <=<, <=>, <=&, <=*
infixr 9 <=^^, <=^<, <=^>, <=^&, <=^*, <=<^, <=<<, <=<>, <=<&, <=<*, <=>^, <=><, <=>>, <=>&, <=>*, <=&^, <=&<, <=&>, <=&&, <=&*, <=*^, <=*<, <=*>, <=*&, <=**
infixr 9 <=^^^, <=^^<, <=^^>, <=^^&, <=^^*, <=^<^, <=^<<, <=^<>, <=^<&, <=^<*, <=^>^, <=^><, <=^>>, <=^>&, <=^>*, <=^&^, <=^&<, <=^&>, <=^&&, <=^&*, <=^*^, <=^*<, <=^*>, <=^*&, <=^**, <=<^^, <=<^<, <=<^>, <=<^&, <=<^*, <=<<^, <=<<<, <=<<>, <=<<&, <=<<*, <=<>^, <=<><, <=<>>, <=<>&, <=<>*, <=<&^, <=<&<, <=<&>, <=<&&, <=<&*, <=<*^, <=<*<, <=<*>, <=<*&, <=<**, <=>^^, <=>^<, <=>^>, <=>^&, <=>^*, <=><^, <=><<, <=><>, <=><&, <=><*, <=>>^, <=>><, <=>>>, <=>>&, <=>>*, <=>&^, <=>&<, <=>&>, <=>&&, <=>&*, <=>*^, <=>*<, <=>*>, <=>*&, <=>**, <=&^^, <=&^<, <=&^>, <=&^&, <=&^*, <=&<^, <=&<<, <=&<>, <=&<&, <=&<*, <=&>^, <=&><, <=&>>, <=&>&, <=&>*, <=&&^, <=&&<, <=&&>, <=&&&, <=&&*, <=&*^, <=&*<, <=&*>, <=&*&, <=&**, <=*^^, <=*^<, <=*^>, <=*^&, <=*^*, <=*<^, <=*<<, <=*<>, <=*<&, <=*<*, <=*>^, <=*><, <=*>>, <=*>&, <=*>*, <=*&^, <=*&<, <=*&>, <=*&&, <=*&*, <=**^, <=**<, <=**>, <=**&, <=***

(<<) :: Monad m => m b -> m a -> m b
(<<) = flip (>>)

$(implementPlumbers flbindSpec)
infixr 9 <<^, <<<, <<>, <<&, <<*
infixr 9 <<^^, <<^<, <<^>, <<^&, <<^*, <<<^, <<<<, <<<>, <<<&, <<<*, <<>^, <<><, <<>>, <<>&, <<>*, <<&^, <<&<, <<&>, <<&&, <<&*, <<*^, <<*<, <<*>, <<*&, <<**
infixr 9 <<^^^, <<^^<, <<^^>, <<^^&, <<^^*, <<^<^, <<^<<, <<^<>, <<^<&, <<^<*, <<^>^, <<^><, <<^>>, <<^>&, <<^>*, <<^&^, <<^&<, <<^&>, <<^&&, <<^&*, <<^*^, <<^*<, <<^*>, <<^*&, <<^**, <<<^^, <<<^<, <<<^>, <<<^&, <<<^*, <<<<^, <<<<<, <<<<>, <<<<&, <<<<*, <<<>^, <<<><, <<<>>, <<<>&, <<<>*, <<<&^, <<<&<, <<<&>, <<<&&, <<<&*, <<<*^, <<<*<, <<<*>, <<<*&, <<<**, <<>^^, <<>^<, <<>^>, <<>^&, <<>^*, <<><^, <<><<, <<><>, <<><&, <<><*, <<>>^, <<>><, <<>>>, <<>>&, <<>>*, <<>&^, <<>&<, <<>&>, <<>&&, <<>&*, <<>*^, <<>*<, <<>*>, <<>*&, <<>**, <<&^^, <<&^<, <<&^>, <<&^&, <<&^*, <<&<^, <<&<<, <<&<>, <<&<&, <<&<*, <<&>^, <<&><, <<&>>, <<&>&, <<&>*, <<&&^, <<&&<, <<&&>, <<&&&, <<&&*, <<&*^, <<&*<, <<&*>, <<&*&, <<&**, <<*^^, <<*^<, <<*^>, <<*^&, <<*^*, <<*<^, <<*<<, <<*<>, <<*<&, <<*<*, <<*>^, <<*><, <<*>>, <<*>&, <<*>*, <<*&^, <<*&<, <<*&>, <<*&&, <<*&*, <<**^, <<**<, <<**>, <<**&, <<***

$(implementPlumbers frbindSpec)
infixr 9 >>^, >><, >>>, >>&, >>*
infixr 9 >>^^, >>^<, >>^>, >>^&, >>^*, >><^, >><<, >><>, >><&, >><*, >>>^, >>><, >>>>, >>>&, >>>*, >>&^, >>&<, >>&>, >>&&, >>&*, >>*^, >>*<, >>*>, >>*&, >>**
infixr 9 >>^^^, >>^^<, >>^^>, >>^^&, >>^^*, >>^<^, >>^<<, >>^<>, >>^<&, >>^<*, >>^>^, >>^><, >>^>>, >>^>&, >>^>*, >>^&^, >>^&<, >>^&>, >>^&&, >>^&*, >>^*^, >>^*<, >>^*>, >>^*&, >>^**, >><^^, >><^<, >><^>, >><^&, >><^*, >><<^, >><<<, >><<>, >><<&, >><<*, >><>^, >><><, >><>>, >><>&, >><>*, >><&^, >><&<, >><&>, >><&&, >><&*, >><*^, >><*<, >><*>, >><*&, >><**, >>>^^, >>>^<, >>>^>, >>>^&, >>>^*, >>><^, >>><<, >>><>, >>><&, >>><*, >>>>^, >>>><, >>>>>, >>>>&, >>>>*, >>>&^, >>>&<, >>>&>, >>>&&, >>>&*, >>>*^, >>>*<, >>>*>, >>>*&, >>>**, >>&^^, >>&^<, >>&^>, >>&^&, >>&^*, >>&<^, >>&<<, >>&<>, >>&<&, >>&<*, >>&>^, >>&><, >>&>>, >>&>&, >>&>*, >>&&^, >>&&<, >>&&>, >>&&&, >>&&*, >>&*^, >>&*<, >>&*>, >>&*&, >>&**, >>*^^, >>*^<, >>*^>, >>*^&, >>*^*, >>*<^, >>*<<, >>*<>, >>*<&, >>*<*, >>*>^, >>*><, >>*>>, >>*>&, >>*>*, >>*&^, >>*&<, >>*&>, >>*&&, >>*&*, >>**^, >>**<, >>**>, >>**&, >>***