streamlined MonadSpec

This commit is contained in:
Edward Kmett 2011-11-09 00:36:12 -05:00
parent 7b5ececdfc
commit bf038b00e6
4 changed files with 26 additions and 19 deletions

2
.gitignore vendored
View File

@ -1,2 +1,4 @@
dist
.hpc
*.swo
*.swp

View File

@ -1,3 +1,7 @@
/1.4/
* Simplified MonadSpec
/1.3/
* Removed old benchmark/test framework.

View File

@ -17,36 +17,37 @@ module Control.Concurrent.Speculation.Class where
import Control.Monad.Trans.Cont
import Control.Concurrent.Speculation
import Data.Function (on)
class MonadSpec m where
-- | When a is unevaluated, @'spec' g a@ evaluates the current continuation
-- with @g@ while testing if @g@ '==' @a@, if they differ, it re-evalutes the
-- continuation with @a@. If @a@ was already evaluated, the continuation is
-- just directly applied to @a@ instead.
specM :: Eq a => a -> a -> m a
-- | As per 'spec', without the check for whether or not the second argument
-- is already evaluated.
specM' :: Eq a => a -> a -> m a
-- | @spec@ with a user supplied comparison function
specByM :: (a -> a -> Bool) -> a -> a -> m a
-- | @spec'@ with a user supplied comparison function
specByM' :: (a -> a -> Bool) -> a -> a -> m a
-- | @spec'@ with a user supplied comparison function
specOnM :: Eq c => (a -> c) -> a -> a -> m a
-- | When a is unevaluated, @'spec' g a@ evaluates the current continuation
-- with @g@ while testing if @g@ '==' @a@, if they differ, it re-evalutes the
-- continuation with @a@. If @a@ was already evaluated, the continuation is
-- just directly applied to @a@ instead.
specM :: (MonadSpec m, Eq a) => a -> a -> m a
specM = specByM (==)
-- | @spec'@ with a user supplied comparison function
specOnM' :: Eq c => (a -> c) -> a -> a -> m a
-- | As per 'spec', without the check for whether or not the second argument
-- is already evaluated.
specM' :: (MonadSpec m, Eq a) => a -> a -> m a
specM' = specByM' (==)
-- | @spec'@ with a user supplied comparison function
specOnM :: (MonadSpec m, Eq c) => (a -> c) -> a -> a -> m a
specOnM = specByM . on (==)
-- | @spec'@ with a user supplied comparison function
specOnM' :: (MonadSpec m, Eq c) => (a -> c) -> a -> a -> m a
specOnM' = specByM . on (==)
-- * Basic speculation
instance Monad m => MonadSpec (ContT r m) where
specM g a = ContT $ \k -> spec g k a
specM' g a = ContT $ \k -> spec' g k a
specByM f g a = ContT $ \k -> specBy f g k a
specByM' f g a = ContT $ \k -> specBy' f g k a
specOnM f g a = ContT $ \k -> specOn f g k a
specOnM' f g a = ContT $ \k -> specOn' f g k a

View File

@ -1,5 +1,5 @@
name: speculation
version: 1.3
version: 1.4
license: BSD3
license-file: LICENSE
author: Edward A. Kmett