safe-buffer-monad: A monadic buffer resilient to exceptions

[ bsd3, control, library ] [ Propose Tags ]

Please see README.md


[Skip to Readme]
Versions 0.1.0
Dependencies base (>=4.7 && <5), mtl (>=2.0 && <3.0), safe-exceptions (>=0.1 && <1.0), stm (>=2.0 && <3.0) [details]
License BSD-3-Clause
Copyright 2017 Diogo Castro
Author Diogo Castro
Maintainer dc@diogocastro.com
Category Control
Home page https://github.com/dcastro/safe-buffer-monad#readme
Bug tracker https://github.com/dcastro/safe-buffer-monad/issues
Source repo head: git clone https://github.com/dcastro/safe-buffer-monad
Uploaded by dcastro at Sun Jun 17 19:16:39 UTC 2018
Distributions NixOS:0.1.0
Downloads 85 total (10 in the last 30 days)
Rating (no votes yet) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2018-06-17 [all 1 reports]
Hackage Matrix CI

Modules

[Index]

Downloads

Maintainer's Corner

For package maintainers and hackage trustees


Readme for safe-buffer-monad-0.1.0

[back to package description]

safe-buffer-monad

A monadic buffer resilient to exceptions.

The SafeBufferMonad typeclass models a buffer that you can write things to. If an exception is thrown, you'll still be able to proccess the contents of the buffer up to the point where the computation was interrupted.

class Monad m => SafeBufferMonad s m | m -> s where
  readBuffer   :: m s
  writeBuffer  :: s -> m ()
  clearBuffer  :: m s
  modifyBuffer :: (s -> s) -> m ()

The buffer can be run using one of these 6 functions:

  • runBuffer / runBufferConcurrently
  • tryRunBuffer / tryRunBufferConcurrently
  • execBuffer / execBufferConcurrently
{-# LANGUAGE FlexibleContexts #-}

import SafeBuffer
import Data.List (intercalate)

go :: (SafeBufferMonad [String] m, MonadIO m) => m String
go = do
  writeBuffer ["line 1"]
  writeBuffer ["line 2"]
  liftIO $ putStrLn "brace for impact!"
  liftIO $ throwIO $ userError "boom"
  writeBuffer ["line 3"]
  pure "done!"

main = runBuffer (appendFile "log.txt" . intercalate "\n") go
λ> main
brace for impact!
*** Exception: user error (boom)

λ> :! tail log.txt
line 1
line 2