content: module Test.Framework.Runners.TimedConsumption (
          consumeListInInterval
      ) where
  
  import Test.Framework.Utilities
  
  import System.CPUTime
  
  
  -- | Evaluates the given list for the given number of microseconds. After the time limit
  -- has been reached, a list is returned consisting of the prefix of the list that was
  -- successfully evaluated within the time limit.
  --
  -- This function does /not/ evaluate the elements of the list: it just ensures that the
  -- list spine arrives in good order.
  --
  -- The spine of the list is evaluated on the current thread, so if spine evaluation blocks
  -- this function will also block, potentially for longer than the specificed delay.
  consumeListInInterval :: Int -> [a] -> IO [a]
  consumeListInInterval delay list = do
      initial_time_ps <- getCPUTime
      go initial_time_ps (microsecondsToPicoseconds (fromIntegral delay)) list
    where
      go _               _        []     = return []
      go initial_time_ps delay_ps (x:xs) = do
          this_time <- getCPUTime
          if this_time - initial_time_ps < delay_ps
           then go initial_time_ps delay_ps xs >>= return . (x:)
           else return []