Tainted 0.0.1 → 0.1.0
raw patch · 4 files changed
+72/−5 lines, 4 filesdep +mtldep ~base
Dependencies added: mtl
Dependency ranges changed: base
Files
- .travis.yml +11/−0
- README.md +2/−1
- Tainted.cabal +5/−4
- src/Control/Monad/Trans/Tainted.hs +54/−0
.travis.yml view
@@ -0,0 +1,11 @@+language: haskell++ghc:+ - 7.8+ - "7.10"++#env:+# - GHCVER='7.10.1'+ +script:+ - cabal install
README.md view
@@ -21,6 +21,7 @@ module TaintExample where import Data.Tainted+import Control.Monad data Expr = Number (Tainted Int)@@ -41,7 +42,7 @@ evalExpr (Number n) = Number n evalExpr (Add e1 e2) = case (evalExpr e1, evalExpr e2) of- (Number i, Number j) -> Number $ (+) <$> i <*> j+ (Number i, Number j) -> Number $ liftM2 (+) i j (x, y) -> Add x y reducedExpr1 = evalExpr expr1
Tainted.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: Tainted-version: 0.0.1+version: 0.1.0 synopsis: Tainted type, and associated operations description: Tainted type, and associated operations homepage: https://github.com/RossMeikleham/Tainted@@ -11,7 +11,7 @@ author: RossMeikleham maintainer: rossmeikleham@hotmail.co.uk copyright: Copyright (C) 2015 Ross Meikleham-category: Data, Monads+category: Data, Monads, Control, Trans build-type: Simple cabal-version: >=1.10 extra-source-files:@@ -26,8 +26,9 @@ library- exposed-modules: Data.Tainted- build-depends: base >=4.8 && <4.9+ exposed-modules: Data.Tainted Control.Monad.Trans.Tainted+ build-depends: base >=4 && < 5,+ mtl >= 2.0 && < 2.3 hs-source-dirs: src default-language: Haskell2010 ghc-options: -Wall
+ src/Control/Monad/Trans/Tainted.hs view
@@ -0,0 +1,54 @@+-----------------------------------------------------------------------------+-- |+-- Module : Control.Monad+-- Copyright : Ross Meikleham+-- License : BSD-style +-- +-- Maintainer : RossMeikleham@hotmail.co.uk+-- Stability : provisional+-- Portability : portable+--+-- The Tainted type, and associated operations.+-----------------------------------------------------------------------------++module Control.Monad.Trans.Tainted(TaintedT(..), hoistTainted)++where++import Control.Monad+import Control.Monad.Trans+import Data.Tainted++-- | 'TaintedT' is a monad transformed of 'Tainted'+newtype TaintedT m a = TaintedT {runTainted :: m (Tainted a)}+++instance Monad m => Functor (TaintedT m) where+ fmap f = TaintedT . fmap (fmap f) . runTainted++instance Monad m => Applicative (TaintedT m) where+ pure = return+ (<*>) = ap+++instance Monad m => Monad (TaintedT m) where+ return = TaintedT . return . return+ TaintedT x >>= f = TaintedT $ do+ res <- x+ case res of+ Clean v -> runTainted $ f v+ Dirty t -> do+ -- Ensure Dirty stays Dirty+ res <- runTainted $ f t+ return $ case res of+ Clean u -> Dirty u + d -> d+ ++instance MonadTrans TaintedT where+ lift = TaintedT . liftM return+++-- | Lift a 'Tainted' into an 'TaintedT'+hoistTainted :: Monad m => Tainted a -> TaintedT m a+hoistTainted = TaintedT . return