module Control.Search.Combinator.Failure (failure) where



import Control.Search.Language

import Control.Search.GeneratorInfo

import Control.Search.Generator



import Control.Monatron.Monatron hiding (Abort, L, state, cont)

import Control.Monatron.IdT



failLoop uid _super = 

  commentEval $   Eval { structs    = ([],[])

                       , treeState_ = []

                       , evalState_ = []

		       , pushLeftH   = \_ -> return Skip

		       , pushRightH  = \_ -> return Skip

		       , nextSameH   = \_ -> return Skip

		       , nextDiffH   = \_ -> return Skip

                       , bodyH      = \i -> cachedAbort i

                       , addH       = \_ -> return Skip

	 	       , failH      = \i -> cachedAbort i

                       , returnH    = \i -> cachedAbort i

--                       , continue   = \_ -> return true

                       , tryH       = \i -> cachedAbort i

                       , startTryH  = \i -> cachedAbort i

                       , tryLH      = \_ -> return Skip

                       , intArraysE = []

                       , intVarsE   = []

                       , boolArraysE = []

		       , deleteH     = \i -> cachedAbort i

                       , initH      = \_ -> return $ {- DebugOutput $ "fail" ++ show uid >>> -} Skip

                       , toString   = "fail" ++ show uid

                       , canBranch  = return False

                       , complete = const $ return false

                       }



failure :: Search

failure = 

  Search { mkeval     = \super -> get >>= \uid -> return (failLoop uid super)

         , runsearch  = runIdT

         }