module Hat.Control.Monad
  (Functor(gfmap,sfmap),Monad((!>>=),(!>>),greturn,gfail,(|>>=),(|>>),sreturn
      ,sfail),MonadPlus(gmzero,gmplus,smzero,smplus),gmapM,amapM,hmapM,gmapM_
    ,amapM_,hmapM_,gforM,gforM_,gsequence,gsequence_,(!=<<),(+=<<),(*=<<),(!>=>)
    ,(+>=>),(*>=>),(!<=<),gforever,aforever,hforever,gvoid,gjoin,ajoin,hjoin
    ,gmsum,amsum,hmsum,gfilterM,afilterM,hfilterM,gmapAndUnzipM,amapAndUnzipM
    ,hmapAndUnzipM,gzipWithM,azipWithM,hzipWithM,gzipWithM_,azipWithM_
    ,hzipWithM_,gfoldM,afoldM,hfoldM,gfoldM_,afoldM_,hfoldM_,greplicateM
    ,areplicateM,hreplicateM,greplicateM_,areplicateM_,hreplicateM_,gguard
    ,aguard,hguard,gwhen,awhen,hwhen,gunless,aunless,hunless,gliftM,aliftM
    ,hliftM,gliftM2,aliftM2,hliftM2,gliftM3,aliftM3,hliftM3,gliftM4,aliftM4
    ,hliftM4,gliftM5,aliftM5,hliftM5,gap) where

import qualified Hat.PreludeBasic 
import qualified Prelude 
import Hat.Hack 
import qualified Hat.Hat as T 
import Hat.Hat  (WrapVal(wrapVal))
import Hat.Prelude 
import Hat.Monad 

gforM ::
  Monad m =>
  T.RefSrcPos ->
    T.RefExp -> T.R (T.Fun (T.List a) (T.Fun (T.Fun a (m b)) (m (T.List b))))

sforM ::
  Monad m => T.R (T.Fun (T.List a) (T.Fun (T.Fun a (m b)) (m (T.List b))))

gforM pforM p = T.uconstUse pforM p sforM

sforM =
  T.uconstDef T.mkRoot aforM
    (\ p -> T.uap1 T.mkNoSrcPos p (gflip T.mkNoSrcPos p) (gmapM T.mkNoSrcPos p))

gforM_ ::
  Monad m =>
  T.RefSrcPos ->
    T.RefExp -> T.R (T.Fun (T.List a) (T.Fun (T.Fun a (m b)) (m T.Tuple0)))

sforM_ :: Monad m => T.R (T.Fun (T.List a) (T.Fun (T.Fun a (m b)) (m T.Tuple0)))

gforM_ pforM_ p = T.uconstUse pforM_ p sforM_

sforM_ =
  T.uconstDef T.mkRoot aforM_
    (\ p ->
      T.uap1 T.mkNoSrcPos p (gflip T.mkNoSrcPos p) (gmapM_ T.mkNoSrcPos p))

(!>=>) ::
  Monad m =>
  T.RefSrcPos ->
    T.RefExp ->
      T.R (T.Fun (T.Fun a (m b)) (T.Fun (T.Fun b (m c)) (T.Fun a (m c))))

(*>=>) ::
  Monad m =>
  (T.R (T.Fun a (m b))) ->
    (T.R (T.Fun b (m c))) -> T.RefExp -> T.R (T.Fun a (m c))

(!>=>) (%>=>) p = T.ufun2 (+>=>) (%>=>) p (*>=>)

(*>=>) ff fg p =
  T.ufun1 T.mkLambda T.mkNoSrcPos p
    (\ fx p ->
      T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !>>= p) (T.uap1 T.mkNoSrcPos p ff fx)
        fg)

(!<=<) ::
  Monad m =>
  T.RefSrcPos ->
    T.RefExp ->
      T.R (T.Fun (T.Fun b (m c)) (T.Fun (T.Fun a (m b)) (T.Fun a (m c))))

(|<=<) ::
  Monad m => T.R (T.Fun (T.Fun b (m c)) (T.Fun (T.Fun a (m b)) (T.Fun a (m c))))

(!<=<) (%<=<) p = T.uconstUse (%<=<) p (|<=<)

(|<=<) =
  T.uconstDef T.mkRoot (+<=<)
    (\ p -> T.uap1 T.mkNoSrcPos p (gflip T.mkNoSrcPos p) (T.mkNoSrcPos !>=> p))

gforever :: Monad m => T.RefSrcPos -> T.RefExp -> T.R (T.Fun (m a) (m b))

hforever :: Monad m => (T.R (m a)) -> T.RefExp -> T.R (m b)

gforever pforever p = T.ufun1 aforever pforever p hforever

hforever fa p =
  let
    ga' pa' p = T.uconstUse pa' p sa'
    sa' =
      T.uconstDef p a31v19v31v30a'
        (\ p ->
          T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !>> p) fa (ga' T.mkNoSrcPos p)) in
    (ga' T.mkNoSrcPos p)

gvoid :: Functor f => T.RefSrcPos -> T.RefExp -> T.R (T.Fun (f a) (f T.Tuple0))

svoid :: Functor f => T.R (T.Fun (f a) (f T.Tuple0))

gvoid pvoid p = T.uconstUse pvoid p svoid

svoid =
  T.uconstDef T.mkRoot avoid
    (\ p ->
      T.uap1 T.mkNoSrcPos p (gfmap T.mkNoSrcPos p)
        (T.uap1 T.mkNoSrcPos p (gconst T.mkNoSrcPos p)
          (T.con0 T.mkNoSrcPos p T.Tuple0 T.aTuple0)))

gfoldM_ ::
  Monad m =>
  T.RefSrcPos ->
    T.RefExp ->
      T.R
        (T.Fun (T.Fun a (T.Fun b (m a)))
          (T.Fun a (T.Fun (T.List b) (m T.Tuple0))))

hfoldM_ ::
  Monad m =>
  (T.R (T.Fun a (T.Fun b (m a)))) ->
    (T.R a) -> (T.R (T.List b)) -> T.RefExp -> T.R (m T.Tuple0)

gfoldM_ pfoldM_ p = T.ufun3 afoldM_ pfoldM_ p hfoldM_

hfoldM_ ff fa fxs p =
  T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !>> p)
    (T.uwrapForward p (hfoldM ff fa fxs p))
    (T.uap1 T.mkNoSrcPos p (greturn T.mkNoSrcPos p)
      (T.con0 T.mkNoSrcPos p T.Tuple0 T.aTuple0))

greplicateM ::
  Monad m =>
  T.RefSrcPos -> T.RefExp -> T.R (T.Fun Int (T.Fun (m a) (m (T.List a))))

hreplicateM ::
  Monad m => (T.R Int) -> (T.R (m a)) -> T.RefExp -> T.R (m (T.List a))

greplicateM preplicateM p = T.ufun2 areplicateM preplicateM p hreplicateM

hreplicateM fn fx p =
  T.uap1 T.mkNoSrcPos p (gsequence T.mkNoSrcPos p)
    (T.uwrapForward p (hreplicate fn fx p))

greplicateM_ ::
  Monad m =>
  T.RefSrcPos -> T.RefExp -> T.R (T.Fun Int (T.Fun (m a) (m T.Tuple0)))

hreplicateM_ ::
  Monad m => (T.R Int) -> (T.R (m a)) -> T.RefExp -> T.R (m T.Tuple0)

greplicateM_ preplicateM_ p = T.ufun2 areplicateM_ preplicateM_ p hreplicateM_

hreplicateM_ fn fx p =
  T.uap1 T.mkNoSrcPos p (gsequence_ T.mkNoSrcPos p)
    (T.uwrapForward p (hreplicate fn fx p))

tControl_Monad = T.mkModule "Control.Monad" "Control/Monad.hs" Prelude.False

aforM = T.mkVariable tControl_Monad 150001 150027 3 0 "forM" Prelude.False

aforM_ = T.mkVariable tControl_Monad 190001 190028 3 0 "forM_" Prelude.False

(+>=>) = T.mkVariable tControl_Monad 230003 230005 3 2 ">=>" Prelude.False

(+<=<) = T.mkVariable tControl_Monad 270002 270023 3 0 "<=<" Prelude.False

aforever = T.mkVariable tControl_Monad 310001 310036 3 1 "forever" Prelude.False

avoid = T.mkVariable tControl_Monad 350001 350022 3 0 "void" Prelude.False

afoldM_ = T.mkVariable tControl_Monad 390001 390046 3 3 "foldM_" Prelude.False

areplicateM =
  T.mkVariable tControl_Monad 440001 440043 3 2 "replicateM" Prelude.False

areplicateM_ =
  T.mkVariable tControl_Monad 480001 480044 3 2 "replicateM_" Prelude.False

a31v19v31v30a' = T.mkVariable tControl_Monad 310019 310030 3 0 "a'" Prelude.True