monadiccp-0.7.2: Control/Search/Combinator/Post.hs
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE FlexibleContexts #-}
module Control.Search.Combinator.Post (post) where
import Control.Search.Language
import Control.Search.GeneratorInfo
import Control.Search.Generator
import Control.Search.Constraints
postLoop :: VarInfoM m => ConstraintGen -> MkEval m -> MkEval m
postLoop (ConstraintGen c l) par this = do
super <- par this
return $ commentEval $ super
{ tryH = try tryE super
, startTryH = try startTryE super
, toString = "post(<CONSTRAINT>," ++ toString super ++ ")"
, intVarsE = l ++ intVarsE super
}
where try f super = \i -> -- failE super i >>= \fail -> -- XXX
f super i >>= \body ->
c i >>= \cc ->
return $ Post (space i) cc >>> body
-- (Var "status" <== VHook (rp 0 (space i) ++ "->status()")) >>>
-- IfThenElse (Var "status" @== VHook "SS_FAILED") (fail >>> comment "Delete-postLoop-try" >>> Delete (space i)) body
post :: ConstraintGen -> Search -> Search
post c s =
case s of
Search { mkeval = m, runsearch = r } ->
Search { mkeval = postLoop c m
, runsearch = r
}