Hello community,

here is the log from the commit of package ghc-managed for openSUSE:Factory 
checked in at 2016-04-03 23:07:21
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-managed (Old)
 and      /work/SRC/openSUSE:Factory/.ghc-managed.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ghc-managed"

Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-managed/ghc-managed.changes  2016-02-09 
13:32:02.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.ghc-managed.new/ghc-managed.changes     
2016-04-03 23:07:39.000000000 +0200
@@ -1,0 +2,5 @@
+Tue Mar 29 07:53:22 UTC 2016 - mimi...@gmail.com
+
+- update to 1.0.3 
+
+-------------------------------------------------------------------

Old:
----
  managed-1.0.2.tar.gz

New:
----
  managed-1.0.3.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ghc-managed.spec ++++++
--- /var/tmp/diff_new_pack.NUFirI/_old  2016-04-03 23:07:40.000000000 +0200
+++ /var/tmp/diff_new_pack.NUFirI/_new  2016-04-03 23:07:40.000000000 +0200
@@ -18,7 +18,7 @@
 %global pkg_name managed
 
 Name:           ghc-managed
-Version:        1.0.2
+Version:        1.0.3
 Release:        0
 Summary:        A monad for managed values
 Group:          System/Libraries

++++++ managed-1.0.2.tar.gz -> managed-1.0.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/managed-1.0.2/LICENSE new/managed-1.0.3/LICENSE
--- old/managed-1.0.2/LICENSE   2016-01-18 18:56:49.000000000 +0100
+++ new/managed-1.0.3/LICENSE   2014-08-10 18:37:16.000000000 +0200
@@ -1,24 +1,24 @@
-Copyright (c) 2014 Gabriel Gonzalez
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without 
modification,
-are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright notice,
-      this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright notice,
-      this list of conditions and the following disclaimer in the documentation
-      and/or other materials provided with the distribution.
-    * Neither the name of Gabriel Gonzalez nor the names of other contributors
-      may be used to endorse or promote products derived from this software
-      without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+Copyright (c) 2014 Gabriel Gonzalez
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without 
modification,
+are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of Gabriel Gonzalez nor the names of other contributors
+      may be used to endorse or promote products derived from this software
+      without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/managed-1.0.2/Setup.hs new/managed-1.0.3/Setup.hs
--- old/managed-1.0.2/Setup.hs  2016-01-18 18:56:49.000000000 +0100
+++ new/managed-1.0.3/Setup.hs  2014-08-10 18:37:19.000000000 +0200
@@ -1,2 +1,2 @@
-import Distribution.Simple
-main = defaultMain
+import Distribution.Simple
+main = defaultMain
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/managed-1.0.2/managed.cabal 
new/managed-1.0.3/managed.cabal
--- old/managed-1.0.2/managed.cabal     2016-01-18 18:56:49.000000000 +0100
+++ new/managed-1.0.3/managed.cabal     2016-03-28 00:15:29.000000000 +0200
@@ -1,40 +1,40 @@
-Name: managed
-Version: 1.0.2
-Cabal-Version: >=1.8.0.2
-Build-Type: Simple
-License: BSD3
-License-File: LICENSE
-Copyright: 2014 Gabriel Gonzalez
-Author: Gabriel Gonzalez
-Maintainer: gabriel...@gmail.com
-Bug-Reports: https://github.com/Gabriel439/Haskell-Managed-Library/issues
-Synopsis: A monad for managed values
-Description: In Haskell you very often acquire values using the @with...@
-  idiom using functions of type @(a -> IO r) -> IO r@.  This idiom forms a
-  @Monad@, which is a special case of the @ContT@ monad (from @transformers@) 
or
-  the @Codensity@ monad (from @kan-extensions@).  The main purpose behind this
-  package is to provide a restricted form of these monads specialized to this
-  unusually common case.
-  .
-  The reason this package defines a specialized version of these types is to:
-  .
-  * be more beginner-friendly,
-  .
-  * simplify inferred types and error messages, and:
-  .
-  * provide some additional type class instances that would otherwise be orphan
-    instances
-Category: Control
-Source-Repository head
-    Type: git
-    Location: https://github.com/Gabriel439/Haskell-Managed-Library
-
-Library
-    Hs-Source-Dirs: src
-    Build-Depends:
-        base              >= 4.5     && < 5  ,
-        transformers      >= 0.2.0.0 && < 0.5 
-    Exposed-Modules:
-        Control.Monad.Managed,
-        Control.Monad.Managed.Safe
-    GHC-Options: -O2 -Wall
+Name: managed
+Version: 1.0.3
+Cabal-Version: >=1.8.0.2
+Build-Type: Simple
+License: BSD3
+License-File: LICENSE
+Copyright: 2014 Gabriel Gonzalez
+Author: Gabriel Gonzalez
+Maintainer: gabriel...@gmail.com
+Bug-Reports: https://github.com/Gabriel439/Haskell-Managed-Library/issues
+Synopsis: A monad for managed values
+Description: In Haskell you very often acquire values using the @with...@
+  idiom using functions of type @(a -> IO r) -> IO r@.  This idiom forms a
+  @Monad@, which is a special case of the @ContT@ monad (from @transformers@) 
or
+  the @Codensity@ monad (from @kan-extensions@).  The main purpose behind this
+  package is to provide a restricted form of these monads specialized to this
+  unusually common case.
+  .
+  The reason this package defines a specialized version of these types is to:
+  .
+  * be more beginner-friendly,
+  .
+  * simplify inferred types and error messages, and:
+  .
+  * provide some additional type class instances that would otherwise be orphan
+    instances
+Category: Control
+Source-Repository head
+    Type: git
+    Location: https://github.com/Gabriel439/Haskell-Managed-Library
+
+Library
+    Hs-Source-Dirs: src
+    Build-Depends:
+        base              >= 4.5     && < 5  ,
+        transformers      >= 0.2.0.0 && < 0.6
+    Exposed-Modules:
+        Control.Monad.Managed,
+        Control.Monad.Managed.Safe
+    GHC-Options: -O2 -Wall
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/managed-1.0.2/src/Control/Monad/Managed/Safe.hs 
new/managed-1.0.3/src/Control/Monad/Managed/Safe.hs
--- old/managed-1.0.2/src/Control/Monad/Managed/Safe.hs 2016-01-18 
18:56:49.000000000 +0100
+++ new/managed-1.0.3/src/Control/Monad/Managed/Safe.hs 2016-03-27 
23:54:05.000000000 +0200
@@ -1,34 +1,36 @@
-{-# LANGUAGE RankNTypes #-}
-
-{-| This module is a safer subset of "Control.Monad.Managed" that only lets you
-    unwrap the `Managed` type using `runManaged`.  This enforces that you never
-    leak acquired resources from a `Managed` computation.
-
-    In general, you should strive to propagate the `Managed` type as much as
-    possible and use `runManaged` when you are done with acquired resources.
-    However, there are legitimate circumstances where you want to return a 
value
-    other than acquired resource from the bracketed computation, which requires
-    using `Control.Monad.Managed.with`.
-
-    This module is not the default because you can also use the `Managed` type
-    for callback-based code that is completely unrelated to resources.
--}
-
-module Control.Monad.Managed.Safe (
-    -- * Managed
-    Managed,
-    managed,
-    managed_,
-    runManaged,
-
-    -- * Re-exports
-    -- $reexports
-    module Control.Monad.IO.Class
-    ) where
-
-import Control.Monad.IO.Class (MonadIO(liftIO))
-import Control.Monad.Managed (Managed, managed, managed_, runManaged)
-
-{- $reexports
-    "Control.Monad.IO.Class" re-exports 'MonadIO'
--}
+{-# LANGUAGE RankNTypes #-}
+
+{-| This module is a safer subset of "Control.Monad.Managed" that only lets you
+    unwrap the `Managed` type using `runManaged`.  This enforces that you never
+    leak acquired resources from a `Managed` computation.
+
+    In general, you should strive to propagate the `Managed` type as much as
+    possible and use `runManaged` when you are done with acquired resources.
+    However, there are legitimate circumstances where you want to return a 
value
+    other than acquired resource from the bracketed computation, which requires
+    using `Control.Monad.Managed.with`.
+
+    This module is not the default because you can also use the `Managed` type
+    for callback-based code that is completely unrelated to resources.
+-}
+
+module Control.Monad.Managed.Safe (
+    -- * Managed
+    Managed,
+    MonadManaged(..),
+    managed,
+    managed_,
+    runManaged,
+
+    -- * Re-exports
+    -- $reexports
+    module Control.Monad.IO.Class
+    ) where
+
+import Control.Monad.IO.Class (MonadIO(liftIO))
+import Control.Monad.Managed
+    (Managed, MonadManaged(..), managed, managed_, runManaged)
+
+{- $reexports
+    "Control.Monad.IO.Class" re-exports 'MonadIO'
+-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/managed-1.0.2/src/Control/Monad/Managed.hs 
new/managed-1.0.3/src/Control/Monad/Managed.hs
--- old/managed-1.0.2/src/Control/Monad/Managed.hs      2016-01-18 
18:56:49.000000000 +0100
+++ new/managed-1.0.3/src/Control/Monad/Managed.hs      2016-03-28 
00:14:05.000000000 +0200
@@ -1,183 +1,262 @@
-{-# LANGUAGE RankNTypes #-}
-
-{-| An example Haskell program to copy data from one handle to another might
-    look like this:
-
-> main =
->     withFile "inFile.txt" ReadMode $ \inHandle ->
->         withFile "outFile.txt" WriteMode $ \outHandle ->
->             copy inHandle outHandle
->
-> -- A hypothetical function that copies data from one handle to another
-> copy :: Handle -> Handle -> IO ()
-
-    `System.IO.withFile` is one of many functions that acquire some resource in
-    an exception-safe way.  These functions take a callback function as an
-    argument and they invoke the callback on the resource when it becomes
-    available, guaranteeing that the resource is properly disposed if the
-    callback throws an exception.
-
-    These functions usually have a type that ends with the following pattern:
-
->                    Callback
-> --                -----------
-> withXXX :: ... -> (a -> IO r) -> IO r
-
-    Here are some examples of this pattern from the @base@ libraries:
-
-> withArray      :: Storable a => [a] -> (Ptr a   -> IO r) -> IO r
-> withBuffer     ::          Buffer e -> (Ptr e   -> IO r) -> IO r
-> withCAString   ::            String -> (CString -> IO r) -> IO r
-> withForeignPtr ::      ForeignPtr a -> (Ptr a   -> IO r) -> IO r
-> withMVar       ::            Mvar a -> (a       -> IO r) -> IO r
-> withPool       ::                      (Pool    -> IO r) -> IO r
-
-    Acquiring multiple resources in this way requires nesting callbacks.
-    However, you can wrap anything of the form @((a -> IO r) -> IO r)@ in the
-    `Managed` monad, which translates binds to callbacks for you:
-
-> import Control.Monad.Managed
-> import System.IO
->
-> inFile :: FilePath -> Managed Handle
-> inFile filePath = managed (withFile filePath ReadMode)
->
-> outFile :: FilePath -> Managed Handle
-> outFile filePath = managed (withFile filePath WriteMode)
->
-> main = runManaged $ do
->     inHandle  <- inFile "inFile.txt"
->     outHandle <- outFile "outFile.txt"
->     liftIO (copy inHandle outHandle)
-
-    ... or you can just wrap things inline:
-
-> main = runManaged $ do
->     inHandle  <- managed (withFile "inFile.txt" ReadMode)
->     outHandle <- managed (withFile "outFile.txt" WriteMode)
->     liftIO (copy inHandle outHandle)
-
-    Additionally, since `Managed` is a `Monad`, you can take advantage of all
-    your favorite combinators from "Control.Monad".  For example, the
-    `Foreign.Marshal.Utils.withMany` function from "Foreign.Marshal.Utils"
-    becomes a trivial wrapper around `mapM`:
-
-> withMany :: (a -> (b -> IO r) -> IO r) -> [a] -> ([b] -> IO r) -> IO r
-> withMany f = with . mapM (Managed . f)
-
-    Another reason to use `Managed` is that if you wrap a `Monoid` value in
-    `Managed` you get back a new `Monoid`:
-
-> instance Monoid a => Monoid (Managed a)
-
-    This lets you combine managed resources transparently.  You can also lift
-    operations from some numeric type classes this way, too, such as the `Num`
-    type class.
--}
-
-module Control.Monad.Managed (
-    -- * Managed
-    Managed,
-    managed,
-    managed_,
-    with,
-    runManaged,
-
-    -- * Re-exports
-    -- $reexports
-    module Control.Monad.IO.Class
-    ) where
-
-import Control.Applicative (Applicative(pure, (<*>)), liftA2)
-import Control.Monad.IO.Class (MonadIO(liftIO))
-import Data.Monoid (Monoid(mempty, mappend))
-
--- | A managed resource that you acquire using `with`
-newtype Managed a = Managed { (>>-) :: forall r . (a -> IO r) -> IO r }
-
-instance Functor Managed where
-    fmap f mx = Managed (\return_ ->
-        mx >>- \x ->
-        return_ (f x) )
-
-instance Applicative Managed where
-    pure r    = Managed (\return_ ->
-        return_ r )
-
-    mf <*> mx = Managed (\return_ ->
-        mf >>- \f ->
-        mx >>- \x ->
-        return_ (f x) )
-
-instance Monad Managed where
-    return r = Managed (\return_ ->
-        return_ r )
-
-    ma >>= f = Managed (\return_ ->
-        ma  >>- \a ->
-        f a >>- \b ->
-        return_ b )
-
-instance MonadIO Managed where
-    liftIO m = Managed (\return_ -> do
-        a <- m
-        return_ a )
-
-instance Monoid a => Monoid (Managed a) where
-    mempty = pure mempty
-
-    mappend = liftA2 mappend
-
-instance Num a => Num (Managed a) where
-    fromInteger = pure . fromInteger
-    negate = fmap negate
-    abs    = fmap abs
-    signum = fmap signum
-    (+) = liftA2 (+)
-    (*) = liftA2 (*)
-    (-) = liftA2 (-)
-
-instance Fractional a => Fractional (Managed a) where
-    fromRational = pure . fromRational
-    recip = fmap recip
-    (/) = liftA2 (/)
-
-instance Floating a => Floating (Managed a) where
-    pi = pure pi
-    exp   = fmap exp
-    sqrt  = fmap sqrt
-    log   = fmap log
-    sin   = fmap sin
-    tan   = fmap tan
-    cos   = fmap cos
-    asin  = fmap sin
-    atan  = fmap atan
-    acos  = fmap acos
-    sinh  = fmap sinh
-    tanh  = fmap tanh
-    cosh  = fmap cosh
-    asinh = fmap asinh
-    atanh = fmap atanh
-    acosh = fmap acosh
-    (**)    = liftA2 (**)
-    logBase = liftA2 logBase
-
--- | Build a `Managed` value
-managed :: (forall r . (a -> IO r) -> IO r) -> Managed a
-managed = Managed
-
--- | Like 'managed' but for resource-less operations.
-managed_ :: (forall r. IO r -> IO r) -> Managed ()
-managed_ f = managed $ \g -> f $ g ()
-
--- | Acquire a `Managed` value
-with :: Managed a -> (a -> IO r) -> IO r
-with = (>>-)
-
--- | Run a `Managed` computation, enforcing that no acquired resources leak
-runManaged :: Managed () -> IO ()
-runManaged m = m >>- return
-
-{- $reexports
-    "Control.Monad.IO.Class" re-exports 'MonadIO'
--}
+{-# LANGUAGE RankNTypes #-}
+
+{-| An example Haskell program to copy data from one handle to another might
+    look like this:
+
+> main =
+>     withFile "inFile.txt" ReadMode $ \inHandle ->
+>         withFile "outFile.txt" WriteMode $ \outHandle ->
+>             copy inHandle outHandle
+>
+> -- A hypothetical function that copies data from one handle to another
+> copy :: Handle -> Handle -> IO ()
+
+    `System.IO.withFile` is one of many functions that acquire some resource in
+    an exception-safe way.  These functions take a callback function as an
+    argument and they invoke the callback on the resource when it becomes
+    available, guaranteeing that the resource is properly disposed if the
+    callback throws an exception.
+
+    These functions usually have a type that ends with the following pattern:
+
+>                    Callback
+> --                -----------
+> withXXX :: ... -> (a -> IO r) -> IO r
+
+    Here are some examples of this pattern from the @base@ libraries:
+
+> withArray      :: Storable a => [a] -> (Ptr a   -> IO r) -> IO r
+> withBuffer     ::          Buffer e -> (Ptr e   -> IO r) -> IO r
+> withCAString   ::            String -> (CString -> IO r) -> IO r
+> withForeignPtr ::      ForeignPtr a -> (Ptr a   -> IO r) -> IO r
+> withMVar       ::            Mvar a -> (a       -> IO r) -> IO r
+> withPool       ::                      (Pool    -> IO r) -> IO r
+
+    Acquiring multiple resources in this way requires nesting callbacks.
+    However, you can wrap anything of the form @((a -> IO r) -> IO r)@ in the
+    `Managed` monad, which translates binds to callbacks for you:
+
+> import Control.Monad.Managed
+> import System.IO
+>
+> inFile :: FilePath -> Managed Handle
+> inFile filePath = managed (withFile filePath ReadMode)
+>
+> outFile :: FilePath -> Managed Handle
+> outFile filePath = managed (withFile filePath WriteMode)
+>
+> main = runManaged $ do
+>     inHandle  <- inFile "inFile.txt"
+>     outHandle <- outFile "outFile.txt"
+>     liftIO (copy inHandle outHandle)
+
+    ... or you can just wrap things inline:
+
+> main = runManaged $ do
+>     inHandle  <- managed (withFile "inFile.txt" ReadMode)
+>     outHandle <- managed (withFile "outFile.txt" WriteMode)
+>     liftIO (copy inHandle outHandle)
+
+    Additionally, since `Managed` is a `Monad`, you can take advantage of all
+    your favorite combinators from "Control.Monad".  For example, the
+    `Foreign.Marshal.Utils.withMany` function from "Foreign.Marshal.Utils"
+    becomes a trivial wrapper around `mapM`:
+
+> withMany :: (a -> (b -> IO r) -> IO r) -> [a] -> ([b] -> IO r) -> IO r
+> withMany f = with . mapM (Managed . f)
+
+    Another reason to use `Managed` is that if you wrap a `Monoid` value in
+    `Managed` you get back a new `Monoid`:
+
+> instance Monoid a => Monoid (Managed a)
+
+    This lets you combine managed resources transparently.  You can also lift
+    operations from some numeric type classes this way, too, such as the `Num`
+    type class.
+
+    NOTE: `Managed` may leak space if used in an infinite loop like this
+    example:
+
+> import Control.Monad
+> import Control.Monad.Managed
+> 
+> main = runManaged (forever (liftIO (print 1)))
+
+    If you need to acquire a resource for a long-lived loop, you can instead
+    acquire the resource first and run the loop in `IO`, using either of the
+    following two equivalent idioms:
+
+> with resource (\r -> forever (useThe r))
+>
+> do r <- resource
+>    liftIO (forever (useThe r))
+-}
+
+module Control.Monad.Managed (
+    -- * Managed
+    Managed,
+    MonadManaged(..),
+    managed,
+    managed_,
+    with,
+    runManaged,
+
+    -- * Re-exports
+    -- $reexports
+    module Control.Monad.IO.Class
+    ) where
+
+import Control.Applicative (Applicative(pure, (<*>)), liftA2)
+import Control.Monad.IO.Class (MonadIO(liftIO))
+import Control.Monad.Trans.Class (lift)
+import Data.Monoid (Monoid(mempty, mappend))
+
+import qualified Control.Monad.Trans.Cont          as Cont
+import qualified Control.Monad.Trans.Except        as Except
+import qualified Control.Monad.Trans.Identity      as Identity
+import qualified Control.Monad.Trans.Maybe         as Maybe
+import qualified Control.Monad.Trans.Reader        as Reader
+import qualified Control.Monad.Trans.RWS.Lazy      as RWS.Lazy
+import qualified Control.Monad.Trans.RWS.Strict    as RWS.Strict
+import qualified Control.Monad.Trans.State.Lazy    as State.Lazy
+import qualified Control.Monad.Trans.State.Strict  as State.Strict
+import qualified Control.Monad.Trans.Writer.Lazy   as Writer.Lazy
+import qualified Control.Monad.Trans.Writer.Strict as Writer.Strict
+
+-- | A managed resource that you acquire using `with`
+newtype Managed a = Managed { (>>-) :: forall r . (a -> IO r) -> IO r }
+
+instance Functor Managed where
+    fmap f mx = Managed (\return_ ->
+        mx >>- \x ->
+        return_ (f x) )
+
+instance Applicative Managed where
+    pure r    = Managed (\return_ ->
+        return_ r )
+
+    mf <*> mx = Managed (\return_ ->
+        mf >>- \f ->
+        mx >>- \x ->
+        return_ (f x) )
+
+instance Monad Managed where
+    return r = Managed (\return_ ->
+        return_ r )
+
+    ma >>= f = Managed (\return_ ->
+        ma  >>- \a ->
+        f a >>- \b ->
+        return_ b )
+
+instance MonadIO Managed where
+    liftIO m = Managed (\return_ -> do
+        a <- m
+        return_ a )
+
+instance Monoid a => Monoid (Managed a) where
+    mempty = pure mempty
+
+    mappend = liftA2 mappend
+
+instance Num a => Num (Managed a) where
+    fromInteger = pure . fromInteger
+    negate = fmap negate
+    abs    = fmap abs
+    signum = fmap signum
+    (+) = liftA2 (+)
+    (*) = liftA2 (*)
+    (-) = liftA2 (-)
+
+instance Fractional a => Fractional (Managed a) where
+    fromRational = pure . fromRational
+    recip = fmap recip
+    (/) = liftA2 (/)
+
+instance Floating a => Floating (Managed a) where
+    pi = pure pi
+    exp   = fmap exp
+    sqrt  = fmap sqrt
+    log   = fmap log
+    sin   = fmap sin
+    tan   = fmap tan
+    cos   = fmap cos
+    asin  = fmap sin
+    atan  = fmap atan
+    acos  = fmap acos
+    sinh  = fmap sinh
+    tanh  = fmap tanh
+    cosh  = fmap cosh
+    asinh = fmap asinh
+    atanh = fmap atanh
+    acosh = fmap acosh
+    (**)    = liftA2 (**)
+    logBase = liftA2 logBase
+
+{-| You can embed a `Managed` action within any `Monad` that implements
+    `MonadManaged` by using the `using` function
+
+    All instances must obey the following two laws:
+
+> using (return x) = return x
+>
+> using (m >>= f) = using m >>= \x -> using (f x)
+-}
+class MonadIO m => MonadManaged m where
+    using :: Managed a -> m a
+
+instance MonadManaged Managed where
+    using = id
+
+instance MonadManaged m => MonadManaged (Cont.ContT r m) where
+    using m = lift (using m)
+
+instance MonadManaged m => MonadManaged (Except.ExceptT e m) where
+    using m = lift (using m)
+
+instance MonadManaged m => MonadManaged (Identity.IdentityT m) where
+    using m = lift (using m)
+
+instance MonadManaged m => MonadManaged (Maybe.MaybeT m) where
+    using m = lift (using m)
+
+instance MonadManaged m => MonadManaged (Reader.ReaderT r m) where
+    using m = lift (using m)
+
+instance (Monoid w, MonadManaged m) => MonadManaged (RWS.Lazy.RWST r w s m) 
where
+    using m = lift (using m)
+
+instance (Monoid w, MonadManaged m) => MonadManaged (RWS.Strict.RWST r w s m) 
where
+    using m = lift (using m)
+
+instance MonadManaged m => MonadManaged (State.Strict.StateT s m) where
+    using m = lift (using m)
+
+instance MonadManaged m => MonadManaged (State.Lazy.StateT s m) where
+    using m = lift (using m)
+
+instance (Monoid w, MonadManaged m) => MonadManaged (Writer.Strict.WriterT w 
m) where
+    using m = lift (using m)
+
+instance (Monoid w, MonadManaged m) => MonadManaged (Writer.Lazy.WriterT w m) 
where
+    using m = lift (using m)
+
+-- | Build a `Managed` value
+managed :: (forall r . (a -> IO r) -> IO r) -> Managed a
+managed = Managed
+
+-- | Like 'managed' but for resource-less operations.
+managed_ :: (forall r. IO r -> IO r) -> Managed ()
+managed_ f = managed $ \g -> f $ g ()
+
+-- | Acquire a `Managed` value
+with :: Managed a -> (a -> IO r) -> IO r
+with = (>>-)
+
+-- | Run a `Managed` computation, enforcing that no acquired resources leak
+runManaged :: Managed () -> IO ()
+runManaged m = m >>- return
+
+{- $reexports
+    "Control.Monad.IO.Class" re-exports 'MonadIO'
+-}


Reply via email to