module Hat.Maybe
  (gisJust,aisJust,hisJust,gisNothing,gfromJust,afromJust,hfromJust,gfromMaybe
    ,afromMaybe,hfromMaybe,glistToMaybe,alistToMaybe,hlistToMaybe,gmaybeToList
    ,amaybeToList,hmaybeToList,gcatMaybes,acatMaybes,hcatMaybes,gmapMaybe
    ,amapMaybe,hmapMaybe,Maybe(Nothing,Just),aNothing,aJust,gmaybe,amaybe
    ,hmaybe) 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 

gisJust :: T.RefSrcPos -> T.RefExp -> T.R (T.Fun (Maybe a) Bool)

hisJust :: (T.R (Maybe a)) -> T.RefExp -> T.R Bool

gisJust pisJust p = T.ufun1 aisJust pisJust p hisJust

hisJust (T.R (Just fa) _) p = T.con0 T.mkNoSrcPos p True aTrue
hisJust (T.R Nothing _) p = T.con0 T.mkNoSrcPos p False aFalse
hisJust _ p = T.fatal p

gisNothing :: T.RefSrcPos -> T.RefExp -> T.R (T.Fun (Maybe a) Bool)

sisNothing :: T.R (T.Fun (Maybe a) Bool)

gisNothing pisNothing p = T.uconstUse pisNothing p sisNothing

sisNothing =
  T.uconstDef T.mkRoot aisNothing
    (\ p ->
      T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !. p) (gnot T.mkNoSrcPos p)
        (gisJust T.mkNoSrcPos p))

gfromJust :: T.RefSrcPos -> T.RefExp -> T.R (T.Fun (Maybe a) a)

hfromJust :: (T.R (Maybe a)) -> T.RefExp -> T.R a

gfromJust pfromJust p = T.ufun1 afromJust pfromJust p hfromJust

hfromJust (T.R (Just fa) _) p = T.projection T.mkNoSrcPos p fa
hfromJust (T.R Nothing _) p =
  T.uwrapForward p
    (herror (T.fromLitString T.mkNoSrcPos p "Maybe.fromJust: Nothing") p)
hfromJust _ p = T.fatal p

gfromMaybe :: T.RefSrcPos -> T.RefExp -> T.R (T.Fun a (T.Fun (Maybe a) a))

hfromMaybe :: (T.R a) -> (T.R (Maybe a)) -> T.RefExp -> T.R a

gfromMaybe pfromMaybe p = T.ufun2 afromMaybe pfromMaybe p hfromMaybe

hfromMaybe fd (T.R Nothing _) p = T.projection T.mkNoSrcPos p fd
hfromMaybe fd (T.R (Just fa) _) p = T.projection T.mkNoSrcPos p fa
hfromMaybe _ _ p = T.fatal p

gmaybeToList :: T.RefSrcPos -> T.RefExp -> T.R (T.Fun (Maybe a) (T.List a))

hmaybeToList :: (T.R (Maybe a)) -> T.RefExp -> T.R (T.List a)

gmaybeToList pmaybeToList p = T.ufun1 amaybeToList pmaybeToList p hmaybeToList

hmaybeToList (T.R Nothing _) p = T.con0 T.mkNoSrcPos p T.List T.aList
hmaybeToList (T.R (Just fa) _) p = T.fromExpList T.mkNoSrcPos p [fa]
hmaybeToList _ p = T.fatal p

glistToMaybe :: T.RefSrcPos -> T.RefExp -> T.R (T.Fun (T.List a) (Maybe a))

hlistToMaybe :: (T.R (T.List a)) -> T.RefExp -> T.R (Maybe a)

glistToMaybe plistToMaybe p = T.ufun1 alistToMaybe plistToMaybe p hlistToMaybe

hlistToMaybe (T.R T.List _) p = T.con0 T.mkNoSrcPos p Nothing aNothing
hlistToMaybe (T.R (T.Cons fa _) _) p = T.con1 T.mkNoSrcPos p Just aJust fa
hlistToMaybe _ p = T.fatal p

gcatMaybes ::
  T.RefSrcPos -> T.RefExp -> T.R (T.Fun (T.List (Maybe a)) (T.List a))

hcatMaybes :: (T.R (T.List (Maybe a))) -> T.RefExp -> T.R (T.List a)

gcatMaybes pcatMaybes p = T.ufun1 acatMaybes pcatMaybes p hcatMaybes

hcatMaybes fms p =
  T.uap1 T.mkNoSrcPos p
    (T.uap2 T.mkNoSrcPos p (Hat.Prelude.g_foldr T.mkNoSrcPos p)
      (T.ufun2 T.mkLambda T.mkNoSrcPos p
        (\ f_x f_y p ->
          T.uccase T.mkNoSrcPos p
            (let
              v0v0v0v0v1 (T.R (Just fm) _) p =
                T.uap1 T.mkNoSrcPos p
                  (T.pa1 T.Cons T.cn1 T.mkNoSrcPos p T.aCons fm) f_y
              v0v0v0v0v1 _ p = T.projection T.mkNoSrcPos p f_y in (v0v0v0v0v1))
            f_x)) fms) (T.fromExpList T.mkNoSrcPos p [])

gmapMaybe ::
  T.RefSrcPos ->
    T.RefExp -> T.R (T.Fun (T.Fun a (Maybe b)) (T.Fun (T.List a) (T.List b)))

hmapMaybe ::
  (T.R (T.Fun a (Maybe b))) -> T.RefExp -> T.R (T.Fun (T.List a) (T.List b))

gmapMaybe pmapMaybe p = T.ufun1 amapMaybe pmapMaybe p hmapMaybe

hmapMaybe ff p =
  T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !. p) (gcatMaybes T.mkNoSrcPos p)
    (T.uap1 T.mkNoSrcPos p (gmap T.mkNoSrcPos p) ff)

tMaybe = T.mkModule "Maybe" "Maybe.hs" Prelude.False

aisJust = T.mkVariable tMaybe 120001 130031 3 1 "isJust" Prelude.False

aisNothing = T.mkVariable tMaybe 160001 160032 3 0 "isNothing" Prelude.False

afromJust = T.mkVariable tMaybe 190001 200057 3 1 "fromJust" Prelude.False

afromMaybe = T.mkVariable tMaybe 230001 240027 3 2 "fromMaybe" Prelude.False

amaybeToList = T.mkVariable tMaybe 270001 280029 3 1 "maybeToList" Prelude.False

alistToMaybe = T.mkVariable tMaybe 310001 320032 3 1 "listToMaybe" Prelude.False

acatMaybes = T.mkVariable tMaybe 350001 350009 3 1 "catMaybes" Prelude.False

amapMaybe = T.mkVariable tMaybe 380001 380043 3 1 "mapMaybe" Prelude.False