diff --git a/Data/IsEvaluated.hs b/Data/IsEvaluated.hs
new file mode 100644
--- /dev/null
+++ b/Data/IsEvaluated.hs
@@ -0,0 +1,21 @@
+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
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,3 @@
+#!/usr/bin/env runhaskell
+> import Distribution.Simple
+> main = defaultMain
diff --git a/isevaluated.cabal b/isevaluated.cabal
new file mode 100644
--- /dev/null
+++ b/isevaluated.cabal
@@ -0,0 +1,18 @@
+name:                isevaluated
+version:             0.1
+synopsis:            Check whether a value has been evaluated
+description:         An IO action to check whether some value has been evaluated.
+                     .
+                     If isEvaluated returns True, evaluating it to weak-head
+                     normal form won't throw exceptions or take time.
+category:            Control, Data
+license:             PublicDomain
+author:              Svein Ove Aas
+maintainer:          svein.ove@aas.no
+build-type:          Simple
+cabal-version:       >= 1.2
+stability:           experimental
+
+Library
+  build-depends:       base, ghc > 6.10.1, ghc <= 6.10.3
+  Exposed-Modules:     Data.IsEvaluated
