{-# LANGUAGE FlexibleContexts #-}

{-# LANGUAGE RankNTypes #-}



module Control.Search.Combinator.Print (prt,dbg) where



import Control.Search.Language

import Control.Search.GeneratorInfo

import Control.Search.Generator



import Control.Monatron.IdT



printLoop :: [String] -> MkEval m

printLoop lst super = return $ commentEval $ super

                       { returnH = \i -> returnE super $ i `onCommit` Print (space i) lst

                       , toString = "print(" ++ toString super ++ ")"

                       }



debugLoop :: Evalable m => String -> MkEval m

debugLoop str super = return $ commentEval $ super

                 { initH = \i -> return (DebugOutput str) @>>>@ initH super i

                 , toString = "debug(" ++ show str ++ "," ++ toString super ++ ")"

                 }



prt :: [String] -> Search

prt l = 

  Search { mkeval     = printLoop l

         , runsearch  = runIdT

         }



dbg :: String -> Search

dbg str = 

  Search { mkeval     = debugLoop str

         , runsearch  = runIdT

         }