supervisor (empty) → 0.1.0.0
raw patch · 4 files changed
+198/−0 lines, 4 filesdep +MonadCatchIO-transformersdep +basedep +monadlocsetup-changed
Dependencies added: MonadCatchIO-transformers, base, monadloc, mtl
Files
- Control/Monad/Supervisor/Trace.hs +103/−0
- LICENSE +30/−0
- Setup.hs +2/−0
- supervisor.cabal +63/−0
+ Control/Monad/Supervisor/Trace.hs view
@@ -0,0 +1,103 @@+{-# LANGUAGE ScopedTypeVariables, UndecidableInstances #-}++-- | This module add a 'MonadLoc' instance to the 'Supervisor' monad. This instance generates a trace when a+-- uncaugh exception is raised.+--+-- . See the MonadLoc package: <http://hackage.haskell.org/package/monadloc>+--+-- The package control-monad-exception produces call stacks using @monadloc@, but the @Supervisor@ monad+-- produces execution traces thanks to the backtracking mechanism.+--+-- The trace is produced after the exception is raised. So it does not generate+-- overhead in normal execution.+--+-- For more finer control of exceptions, ej. for retrowing exceptions managed outside the Supervisor monad+-- , create your own instance+--+-- Execute the example at @Demos/TraceExample.hs@+--+--+-- > {-# OPTIONS -F -pgmF MonadLoc #-}+-- > module Demos.TraceExample (+-- >+-- > ) where+-- >+-- > import Control.Monad.Loc+-- > import Control.Monad.Supervisor.Trace+-- > import Control.Monad.Trans+-- >+-- > main= runTrace $ do+-- > liftIO $ print "hello"+-- >+-- > example+-- >+-- > example=+-- > if True+-- > then do+-- > liftIO $ print "world"+-- > liftIO $ undefined+-- >+-- > else liftIO $ print "not there"+--+-- Produce this trace:+--+-- @+-- \"hello\"+-- \"world\"+-- TraceExample.hs: TRACE (error in the last line):+-- .+-- main, Demos.TraceExample(Demos\TraceExample.hs): (23, 18)+-- main, Demos.TraceExample(Demos\TraceExample.hs): (26, 4)+-- example, Demos.TraceExample(Demos\TraceExample.hs): (30, 13)+-- example, Demos.TraceExample(Demos\TraceExample.hs): (32, 15)+-- exception: Prelude.undefined+-- @++-- TO DO: extend it for forward traces and test coverages++module Control.Monad.Supervisor.Trace(runTrace) where+ +import Control.Monad.Supervisor+import Control.Monad.Loc+import Control.Monad.State+import Control.Monad.CatchIO as CMC+import Control.Exception (SomeException)+import Data.List(intersperse)+++type Trace= [String]++instance (MonadLoc m, Supervise Trace m, MonadCatchIO m)=> MonadLoc (Sup m) where+ withLoc loc (Sup f) = Sup $ do+ withLoc loc $ do+ r <- f `CMC.catch` handler1+ trace <- get + case trace of+ [] -> return r -- all ok+ trace -> put (loc:trace) >> return r -- is going back with a trace, we add one more line+ return r++ where+ -- detected failure, add the first line of trace with the error, init execution back + handler1 (e :: SomeException)= put ["exception: " ++show e] >> return Backward++type WState m = StateT [String] m++-- | Execute an Supervisor computation and raise an error with a trace when an uncaugh exception+-- is raised. It is necessary to preprocess the file with the monadloc-pp preprocessor.+--+-- Otherwise, it produces the same error with no trace.+runTrace :: Sup (WState IO) () -> IO (Control ())+runTrace f= evalStateT (runSup f1) []+ where+ f1= printBackTrace >> f+ printBackTrace= do+ s <- get+ case s of+ [] -> breturn()+ tr -> error (disp tr)+ where+ disp tr= "TRACE (error in the last line):\n\n" ++(concat $ intersperse "\n" tr) +++
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2013, Alberto G. Corona + +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 Alberto G. Corona 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.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple +main = defaultMain
+ supervisor.cabal view
@@ -0,0 +1,63 @@+-- Initial supervisor.cabal generated by cabal init. For further +-- documentation, see http://haskell.org/cabal/users-guide/ + +-- The name of the package. +name: supervisor + +-- The package version. See the Haskell package versioning policy (PVP) +-- for standards guiding when and how versions should be incremented. +-- http://www.haskell.org/haskellwiki/Package_versioning_policy +-- PVP summary: +-+------- breaking API changes +-- | | +----- non-breaking API additions +-- | | | +--- code changes with no API change +version: 0.1.0.0 + +-- A short (one-line) description of the package. +synopsis: Control an internal monad execution for trace generation, backtrakcking, testing and other purposes + +-- A longer description of the package. +description: A supervisor monad that explore the execution tree of an internal monad and define extra behaviours thanks to flexible instance definitions for each particular purpose.+ It can inject new behaviours for backtracking, trace generation, testing, transaction rollbacks etc+ .+ The supervisor monad is used in the package MFlow to control the routing, state management, back button management and navigation in general.+ .+ Currently only the generation of an execution trace on case of error is developped. See @Control.Monad.Supervisor.Trace@ and the example at @Demos/TraceExample.hs@+ + +-- URL for the project homepage or repository. +homepage: http://github.com/agocorona/supervisor + +-- The license under which the package is released. +license: BSD3 + +-- The file containing the license text. +license-file: LICENSE + +-- The package author(s). +author: Alberto G. Corona + +-- An email address to which users can send suggestions, bug reports, and +-- patches. +maintainer: agocorona@gmail.com + +-- A copyright notice. +-- copyright: + +category: Control + +build-type: Simple + +-- Constraint on the version of Cabal needed to build this package. +cabal-version: >=1.8 + + +library + -- Modules exported by the library. + exposed-modules: Control.Monad.Supervisor.Trace + + -- Modules included in this library but not exported. + -- other-modules: + + -- Other library packages from which modules are imported. + build-depends: base ==4.5.*, mtl -any, monadloc -any, MonadCatchIO-transformers -any +