-- |Conversion to 'GenericData' with time and space limit.
module Data.Data.Eval 
    ( eval
    , evalWithBudget
    ) where

import Data.Data.GenRep (GenericData, constructor)
import System.IO.Parallel (manyParallel)
import System.SimpleTimeout.Limits

import Data.Data (Data, gmapQ)

-------------------------

-- |Evaluation with time an size limit.
eval :: Data a => TimeLimit -> SizeLimit -> a -> IO GenericData
eval seconds chars x = do
    b <- newBudget seconds chars
    evalWithBudget b x

-- |Gives more control over the resources
evalWithBudget :: Data a => Budget -> a -> IO GenericData
evalWithBudget b x
    = constructor b x
    $ manyParallel
    $ gmapQ (evalWithBudget b) x