{-# LANGUAGE TypeFamilies #-}
module LLVM.Extra.Maybe (
Maybe.T(..),
Maybe.run,
Maybe.for,
Maybe.select,
Maybe.alternative,
Maybe.fromBool,
Maybe.toBool,
Maybe.getIsNothing,
Maybe.just,
nothing,
Maybe.sequence,
Maybe.traverse,
Maybe.lift2,
Maybe.liftM2,
loopWithExit,
) where
import qualified LLVM.Extra.Tuple as Tuple
import qualified LLVM.Extra.MaybePrivate as Maybe
import qualified LLVM.Extra.Control as C
import LLVM.Core (CodeGenFunction, )
nothing :: (Tuple.Undefined a) => Maybe.T a
nothing = Maybe.nothing Tuple.undef
loopWithExit ::
Tuple.Phi a =>
a ->
(a -> CodeGenFunction r (Maybe.T c, b)) ->
((c,b) -> CodeGenFunction r a) ->
CodeGenFunction r b
loopWithExit start check body =
fmap snd $
C.loopWithExit start
(\a -> do
(mc,b) <- check a
let (j,c) = Maybe.toBool mc
return (j, (c,b)))
body