{-# 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(," ++ 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 }