{-# 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
         }