data-checked 0.2 → 0.3
raw patch · 3 files changed
+58/−2 lines, 3 files
Files
- data-checked.cabal +2/−1
- src/Data/Checked.hs +0/−1
- src/Data/Checked/Strict.hs +56/−0
data-checked.cabal view
@@ -1,5 +1,5 @@ Name: data-checked-Version: 0.2+Version: 0.3 Category: Data Stability: experimental Synopsis: Type-indexed runtime-checked properties @@ -30,4 +30,5 @@ GHC-Options: -Wall Exposed-Modules: Data.Checked+ Data.Checked.Strict
src/Data/Checked.hs view
@@ -60,4 +60,3 @@ check v | holds (undefined ∷ p) v = Just (Checked v) | otherwise = Nothing {-# INLINABLE check #-}-
+ src/Data/Checked/Strict.hs view
@@ -0,0 +1,56 @@+{-# LANGUAGE UnicodeSyntax #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE ScopedTypeVariables #-}++-- | A version of 'DC.Checked' that requires client code to provide+-- a non-bottom value of the property index type to use @trust*@+-- functions.+module Data.Checked.Strict+ ( Checked+ , trustThat+ , trustMap+ , checked+ , Property(..)+ , maybeHolds+ , check+ , relax+ ) where++import Data.Typeable (Typeable)+import Control.DeepSeq (NFData(..))+import Data.Checked (Property(..), maybeHolds)+import qualified Data.Checked as DC++-- | Wrapper-evidence for property /p/.+newtype Checked p v = Checked v deriving Typeable++instance NFData v ⇒ NFData (Checked p v) where+ rnf (Checked v) = rnf v++-- | Use when the property can be deduced without a runtime check.+-- Note that /p/ is evaluated to WHNF, so you can't use 'undefined'.+trustThat ∷ p → v → Checked p v+trustThat p v = p `seq` Checked v+{-# INLINE trustThat #-}++-- | Apply a fuction that preserves the property to the checked value.+-- Note that /p/ is evaluated to WHNF, so you can't use 'undefined'.+trustMap ∷ p → (v → v) → Checked p v → Checked p v+trustMap p f (Checked v) = p `seq` Checked (f v)+{-# INLINE trustMap #-}++-- | Unwrap the checked value.+checked ∷ Checked p v → v+checked (Checked v) = v+{-# INLINE checked #-}++-- | Wrap the value if the property holds.+check ∷ ∀ p v . Property p v ⇒ v → Maybe (Checked p v)+check v | holds (undefined ∷ p) v = Just (Checked v)+ | otherwise = Nothing+{-# INLINABLE check #-}++-- | Rewrap a value into the less strict 'DC.Checked' type.+relax ∷ Checked p v → DC.Checked p v+relax (Checked v) = DC.trustMe v+{-# INLINE relax #-}