hat-2.7.0.0: Hat/Monad.hs
module Hat.Monad
(MonadPlus(gmzero,gmplus,smzero,smplus),gjoin,ajoin,hjoin,gguard,aguard,hguard
,gwhen,awhen,hwhen,gunless,aunless,hunless,gap,gmsum,amsum,hmsum,gfilterM
,afilterM,hfilterM,gmapAndUnzipM,amapAndUnzipM,hmapAndUnzipM,gzipWithM
,azipWithM,hzipWithM,gzipWithM_,azipWithM_,hzipWithM_,gfoldM,afoldM,hfoldM
,gliftM,aliftM,hliftM,gliftM2,aliftM2,hliftM2,gliftM3,aliftM3,hliftM3
,gliftM4,aliftM4,hliftM4,gliftM5,aliftM5,hliftM5,Monad((!>>=),(!>>),greturn
,gfail,(|>>=),(|>>),sreturn,sfail),Functor(gfmap,sfmap),gmapM,amapM,hmapM
,gmapM_,amapM_,hmapM_,gsequence,gsequence_,(!=<<),(+=<<),(*=<<)) 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
class Monad m => MonadPlus m
where
gmzero :: T.RefSrcPos -> T.RefExp -> T.R (m a)
gmplus :: T.RefSrcPos -> T.RefExp -> T.R (T.Fun (m a) (T.Fun (m a) (m a)))
smzero :: T.R (m a)
smplus :: T.R (T.Fun (m a) (T.Fun (m a) (m a)))
instance MonadPlus (Maybe)
where
gmzero pmzero p = T.uconstUse pmzero p smzero
smzero =
T.uconstDef T.mkRoot a25v5v25v35mzero
(\ p -> T.con0 T.mkNoSrcPos p Nothing aNothing)
gmplus pmplus p =
T.ufun2 a27v14v28v18mplus pmplus p hmplus
where
hmplus (T.R Nothing _) fys p = T.projection T.mkNoSrcPos p fys
hmplus fxs fys p = T.projection T.mkNoSrcPos p fxs
instance MonadPlus (T.List)
where
gmzero pmzero p = T.uconstUse pmzero p smzero
smzero =
T.uconstDef T.mkRoot a31v5v31v15mzero
(\ p -> T.con0 T.mkNoSrcPos p T.List T.aList)
gmplus pmplus p = T.uconstUse pmplus p smplus
smplus = T.uconstDef T.mkRoot a32v5v32v15mplus (\ p -> (T.mkNoSrcPos !++ p))
gmsum ::
MonadPlus m => T.RefSrcPos -> T.RefExp -> T.R (T.Fun (T.List (m a)) (m a))
hmsum :: MonadPlus m => (T.R (T.List (m a))) -> T.RefExp -> T.R (m a)
gmsum pmsum p = T.ufun1 amsum pmsum p hmsum
hmsum fxs p =
T.uwrapForward p
(hfoldr (gmplus T.mkNoSrcPos p) (gmzero T.mkNoSrcPos p) fxs p)
gjoin :: Monad m => T.RefSrcPos -> T.RefExp -> T.R (T.Fun (m (m a)) (m a))
hjoin :: Monad m => (T.R (m (m a))) -> T.RefExp -> T.R (m a)
gjoin pjoin p = T.ufun1 ajoin pjoin p hjoin
hjoin fx p = T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !>>= p) fx (gid T.mkNoSrcPos p)
gwhen ::
Monad m =>
T.RefSrcPos -> T.RefExp -> T.R (T.Fun Bool (T.Fun (m T.Tuple0) (m T.Tuple0)))
hwhen ::
Monad m => (T.R Bool) -> (T.R (m T.Tuple0)) -> T.RefExp -> T.R (m T.Tuple0)
gwhen pwhen p = T.ufun2 awhen pwhen p hwhen
hwhen fp fs p =
T.ucif p fp (T.projection T.mkNoSrcPos p fs)
(T.uap1 T.mkNoSrcPos p (greturn T.mkNoSrcPos p)
(T.con0 T.mkNoSrcPos p T.Tuple0 T.aTuple0))
gunless ::
Monad m =>
T.RefSrcPos -> T.RefExp -> T.R (T.Fun Bool (T.Fun (m T.Tuple0) (m T.Tuple0)))
hunless ::
Monad m => (T.R Bool) -> (T.R (m T.Tuple0)) -> T.RefExp -> T.R (m T.Tuple0)
gunless punless p = T.ufun2 aunless punless p hunless
hunless fp fs p = T.uwrapForward p (hwhen (T.uwrapForward p (hnot fp p)) fs p)
gap ::
Monad m =>
T.RefSrcPos -> T.RefExp -> T.R (T.Fun (m (T.Fun a b)) (T.Fun (m a) (m b)))
sap :: Monad m => T.R (T.Fun (m (T.Fun a b)) (T.Fun (m a) (m b)))
gap pap p = T.uconstUse pap p sap
sap =
T.uconstDef T.mkRoot aap
(\ p -> T.uwrapForward p (hliftM2 (T.mkNoSrcPos !$ p) p))
gguard ::
MonadPlus m => T.RefSrcPos -> T.RefExp -> T.R (T.Fun Bool (m T.Tuple0))
hguard :: MonadPlus m => (T.R Bool) -> T.RefExp -> T.R (m T.Tuple0)
gguard pguard p = T.ufun1 aguard pguard p hguard
hguard fp p =
T.ucif p fp
(T.uap1 T.mkNoSrcPos p (greturn T.mkNoSrcPos p)
(T.con0 T.mkNoSrcPos p T.Tuple0 T.aTuple0)) (gmzero T.mkNoSrcPos p)
gmapAndUnzipM ::
Monad m =>
T.RefSrcPos ->
T.RefExp ->
T.R
(T.Fun (T.Fun a (m (T.Tuple2 b c)))
(T.Fun (T.List a) (m (T.Tuple2 (T.List b) (T.List c)))))
hmapAndUnzipM ::
Monad m =>
(T.R (T.Fun a (m (T.Tuple2 b c)))) ->
(T.R (T.List a)) -> T.RefExp -> T.R (m (T.Tuple2 (T.List b) (T.List c)))
gmapAndUnzipM pmapAndUnzipM p =
T.ufun2 amapAndUnzipM pmapAndUnzipM p hmapAndUnzipM
hmapAndUnzipM ff fxs p =
T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !>>= p)
(T.uap1 T.mkNoSrcPos p (gsequence T.mkNoSrcPos p)
(T.uwrapForward p (hmap ff fxs p)))
(T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !. p) (greturn T.mkNoSrcPos p)
(gunzip T.mkNoSrcPos p))
gzipWithM ::
Monad m =>
T.RefSrcPos ->
T.RefExp ->
T.R
(T.Fun (T.Fun a (T.Fun b (m c)))
(T.Fun (T.List a) (T.Fun (T.List b) (m (T.List c)))))
hzipWithM ::
Monad m =>
(T.R (T.Fun a (T.Fun b (m c)))) ->
(T.R (T.List a)) -> (T.R (T.List b)) -> T.RefExp -> T.R (m (T.List c))
gzipWithM pzipWithM p = T.ufun3 azipWithM pzipWithM p hzipWithM
hzipWithM ff fxs fys p =
T.uap1 T.mkNoSrcPos p (gsequence T.mkNoSrcPos p)
(T.uwrapForward p (hzipWith ff fxs fys p))
gzipWithM_ ::
Monad m =>
T.RefSrcPos ->
T.RefExp ->
T.R
(T.Fun (T.Fun a (T.Fun b (m c)))
(T.Fun (T.List a) (T.Fun (T.List b) (m T.Tuple0))))
hzipWithM_ ::
Monad m =>
(T.R (T.Fun a (T.Fun b (m c)))) ->
(T.R (T.List a)) -> (T.R (T.List b)) -> T.RefExp -> T.R (m T.Tuple0)
gzipWithM_ pzipWithM_ p = T.ufun3 azipWithM_ pzipWithM_ p hzipWithM_
hzipWithM_ ff fxs fys p =
T.uap1 T.mkNoSrcPos p (gsequence_ T.mkNoSrcPos p)
(T.uwrapForward p (hzipWith ff fxs fys p))
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 a))))
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 a)
gfoldM pfoldM p = T.ufun3 afoldM pfoldM p hfoldM
hfoldM ff fa (T.R T.List _) p =
T.uap1 T.mkNoSrcPos p (greturn T.mkNoSrcPos p) fa
hfoldM ff fa (T.R (T.Cons fx fxs) _) p =
T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !>>= p) (T.uap2 T.mkNoSrcPos p ff fa fx)
(T.ufun1 T.mkLambda T.mkNoSrcPos p
(\ fy p -> T.uwrapForward p (hfoldM ff fy fxs p)))
hfoldM _ _ _ p = T.fatal p
gfilterM ::
Monad m =>
T.RefSrcPos ->
T.RefExp -> T.R (T.Fun (T.Fun a (m Bool)) (T.Fun (T.List a) (m (T.List a))))
hfilterM ::
Monad m =>
(T.R (T.Fun a (m Bool))) -> (T.R (T.List a)) -> T.RefExp -> T.R (m (T.List a))
gfilterM pfilterM p = T.ufun2 afilterM pfilterM p hfilterM
hfilterM fp (T.R T.List _) p =
T.uap1 T.mkNoSrcPos p (greturn T.mkNoSrcPos p)
(T.con0 T.mkNoSrcPos p T.List T.aList)
hfilterM fp (T.R (T.Cons fx fxs) _) p =
T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos Hat.Prelude.!>>= p)
(T.uap1 T.mkNoSrcPos p fp fx)
(T.ufun1 T.mkDoLambda T.mkNoSrcPos p
(\ fb p ->
T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos Hat.Prelude.!>>= p)
(T.uwrapForward p (hfilterM fp fxs p))
(T.ufun1 T.mkDoLambda T.mkNoSrcPos p
(\ fys p ->
T.uap1 T.mkNoSrcPos p (greturn T.mkNoSrcPos p)
(T.ucif p fb (T.con2 T.mkNoSrcPos p T.Cons T.aCons fx fys)
(T.projection T.mkNoSrcPos p fys))))))
hfilterM _ _ p = T.fatal p
gliftM ::
Monad m =>
T.RefSrcPos -> T.RefExp -> T.R (T.Fun (T.Fun a b) (T.Fun (m a) (m b)))
hliftM :: Monad m => (T.R (T.Fun a b)) -> T.RefExp -> T.R (T.Fun (m a) (m b))
gliftM pliftM p = T.ufun1 aliftM pliftM p hliftM
hliftM ff p =
T.ufun1 T.mkLambda T.mkNoSrcPos p
(\ fa p ->
T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos Hat.Prelude.!>>= p) fa
(T.ufun1 T.mkDoLambda T.mkNoSrcPos p
(\ fa' p ->
T.uap1 T.mkNoSrcPos p (greturn T.mkNoSrcPos p)
(T.uap1 T.mkNoSrcPos p ff fa'))))
gliftM2 ::
Monad m =>
T.RefSrcPos ->
T.RefExp ->
T.R (T.Fun (T.Fun a (T.Fun b c)) (T.Fun (m a) (T.Fun (m b) (m c))))
hliftM2 ::
Monad m =>
(T.R (T.Fun a (T.Fun b c))) ->
T.RefExp -> T.R (T.Fun (m a) (T.Fun (m b) (m c)))
gliftM2 pliftM2 p = T.ufun1 aliftM2 pliftM2 p hliftM2
hliftM2 ff p =
T.ufun2 T.mkLambda T.mkNoSrcPos p
(\ fa fb p ->
T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos Hat.Prelude.!>>= p) fa
(T.ufun1 T.mkDoLambda T.mkNoSrcPos p
(\ fa' p ->
T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos Hat.Prelude.!>>= p) fb
(T.ufun1 T.mkDoLambda T.mkNoSrcPos p
(\ fb' p ->
T.uap1 T.mkNoSrcPos p (greturn T.mkNoSrcPos p)
(T.uap2 T.mkNoSrcPos p ff fa' fb'))))))
gliftM3 ::
Monad m =>
T.RefSrcPos ->
T.RefExp ->
T.R
(T.Fun (T.Fun a (T.Fun b (T.Fun c d)))
(T.Fun (m a) (T.Fun (m b) (T.Fun (m c) (m d)))))
hliftM3 ::
Monad m =>
(T.R (T.Fun a (T.Fun b (T.Fun c d)))) ->
T.RefExp -> T.R (T.Fun (m a) (T.Fun (m b) (T.Fun (m c) (m d))))
gliftM3 pliftM3 p = T.ufun1 aliftM3 pliftM3 p hliftM3
hliftM3 ff p =
T.ufun3 T.mkLambda T.mkNoSrcPos p
(\ fa fb fc p ->
T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos Hat.Prelude.!>>= p) fa
(T.ufun1 T.mkDoLambda T.mkNoSrcPos p
(\ fa' p ->
T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos Hat.Prelude.!>>= p) fb
(T.ufun1 T.mkDoLambda T.mkNoSrcPos p
(\ fb' p ->
T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos Hat.Prelude.!>>= p) fc
(T.ufun1 T.mkDoLambda T.mkNoSrcPos p
(\ fc' p ->
T.uap1 T.mkNoSrcPos p (greturn T.mkNoSrcPos p)
(T.uap3 T.mkNoSrcPos p ff fa' fb' fc'))))))))
gliftM4 ::
Monad m =>
T.RefSrcPos ->
T.RefExp ->
T.R
(T.Fun (T.Fun a (T.Fun b (T.Fun c (T.Fun d e))))
(T.Fun (m a) (T.Fun (m b) (T.Fun (m c) (T.Fun (m d) (m e))))))
hliftM4 ::
Monad m =>
(T.R (T.Fun a (T.Fun b (T.Fun c (T.Fun d e))))) ->
T.RefExp ->
T.R (T.Fun (m a) (T.Fun (m b) (T.Fun (m c) (T.Fun (m d) (m e)))))
gliftM4 pliftM4 p = T.ufun1 aliftM4 pliftM4 p hliftM4
hliftM4 ff p =
T.ufun4 T.mkLambda T.mkNoSrcPos p
(\ fa fb fc fd p ->
T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos Hat.Prelude.!>>= p) fa
(T.ufun1 T.mkDoLambda T.mkNoSrcPos p
(\ fa' p ->
T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos Hat.Prelude.!>>= p) fb
(T.ufun1 T.mkDoLambda T.mkNoSrcPos p
(\ fb' p ->
T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos Hat.Prelude.!>>= p) fc
(T.ufun1 T.mkDoLambda T.mkNoSrcPos p
(\ fc' p ->
T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos Hat.Prelude.!>>= p)
fd
(T.ufun1 T.mkDoLambda T.mkNoSrcPos p
(\ fd' p ->
T.uap1 T.mkNoSrcPos p (greturn T.mkNoSrcPos p)
(T.uap4 T.mkNoSrcPos p ff fa' fb' fc'
fd'))))))))))
gliftM5 ::
Monad m =>
T.RefSrcPos ->
T.RefExp ->
T.R
(T.Fun (T.Fun a (T.Fun b (T.Fun c (T.Fun d (T.Fun e f)))))
(T.Fun (m a)
(T.Fun (m b) (T.Fun (m c) (T.Fun (m d) (T.Fun (m e) (m f)))))))
hliftM5 ::
Monad m =>
(T.R (T.Fun a (T.Fun b (T.Fun c (T.Fun d (T.Fun e f)))))) ->
T.RefExp ->
T.R
(T.Fun (m a)
(T.Fun (m b) (T.Fun (m c) (T.Fun (m d) (T.Fun (m e) (m f))))))
gliftM5 pliftM5 p = T.ufun1 aliftM5 pliftM5 p hliftM5
hliftM5 ff p =
T.ufun5 T.mkLambda T.mkNoSrcPos p
(\ fa fb fc fd fe p ->
T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos Hat.Prelude.!>>= p) fa
(T.ufun1 T.mkDoLambda T.mkNoSrcPos p
(\ fa' p ->
T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos Hat.Prelude.!>>= p) fb
(T.ufun1 T.mkDoLambda T.mkNoSrcPos p
(\ fb' p ->
T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos Hat.Prelude.!>>= p) fc
(T.ufun1 T.mkDoLambda T.mkNoSrcPos p
(\ fc' p ->
T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos Hat.Prelude.!>>= p)
fd
(T.ufun1 T.mkDoLambda T.mkNoSrcPos p
(\ fd' p ->
T.uap2 T.mkNoSrcPos p
(T.mkNoSrcPos Hat.Prelude.!>>= p) fe
(T.ufun1 T.mkDoLambda T.mkNoSrcPos p
(\ fe' p ->
T.uap1 T.mkNoSrcPos p
(greturn T.mkNoSrcPos p)
(T.uap5 T.mkNoSrcPos p ff fa' fb' fc' fd'
fe'))))))))))))
tMonad = T.mkModule "Monad" "Monad.hs" Prelude.False
amsum = T.mkVariable tMonad 390001 390032 3 1 "msum" Prelude.False
ajoin = T.mkVariable tMonad 420001 420028 3 1 "join" Prelude.False
awhen = T.mkVariable tMonad 450001 450047 3 2 "when" Prelude.False
aunless = T.mkVariable tMonad 480001 480034 3 2 "unless" Prelude.False
aap = T.mkVariable tMonad 510001 510029 3 0 "ap" Prelude.False
aguard = T.mkVariable tMonad 540001 540051 3 1 "guard" Prelude.False
amapAndUnzipM =
T.mkVariable tMonad 570001 570058 3 2 "mapAndUnzipM" Prelude.False
azipWithM = T.mkVariable tMonad 600001 600045 3 3 "zipWithM" Prelude.False
azipWithM_ = T.mkVariable tMonad 630001 630047 3 3 "zipWithM_" Prelude.False
afoldM = T.mkVariable tMonad 660001 670049 3 3 "foldM" Prelude.False
afilterM = T.mkVariable tMonad 700001 730032 3 2 "filterM" Prelude.False
aliftM = T.mkVariable tMonad 770001 770052 3 1 "liftM" Prelude.False
aliftM2 = T.mkVariable tMonad 800001 800066 3 1 "liftM2" Prelude.False
aliftM3 = T.mkVariable tMonad 840001 850021 3 1 "liftM3" Prelude.False
aliftM4 = T.mkVariable tMonad 890001 900026 3 1 "liftM4" Prelude.False
aliftM5 = T.mkVariable tMonad 940001 950040 3 1 "liftM5" Prelude.False
a25v5v25v35mzero = T.mkVariable tMonad 250005 250035 3 0 "mzero" Prelude.False
a27v14v28v18mplus = T.mkVariable tMonad 270014 280018 3 2 "mplus" Prelude.False
a31v5v31v15mzero = T.mkVariable tMonad 310005 310015 3 0 "mzero" Prelude.False
a32v5v32v15mplus = T.mkVariable tMonad 320005 320015 3 0 "mplus" Prelude.False