isevaluated-0.1: Data/IsEvaluated.hs
module Data.IsEvaluated(isEvaluated) where
import RtClosureInspect
-- |Checks whether Control.Exception.evaluate (or rwhnf) would do no work
-- when applied to the value. May produce false negatives (where isEvaluated
-- thinks it would, but it actually wouldn't) in some cases.
--
-- Use case: if isEvaluated foo returns True, then evaluate foo will never
-- throw an exception, or indeed take more than constant (small) time.
isEvaluated :: a -> IO Bool
isEvaluated a = (discriminate . tipe) `fmap` getClosureData a
where
discriminate Constr = True
discriminate Fun = True
discriminate (Indirection _) = True
discriminate (MutVar _) = True
discriminate (MVar _) = True
discriminate PAP = True
-- It might be possible to handle THUNK_SELECTOR specially
discriminate _ = False