packages feed

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 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