Changing name and adding new log runner.

Add a log runner where a syncronizition primitiv can come from the outside.
This commit is contained in:
Stefan Risberg 2023-04-20 09:22:15 +02:00
parent aa7ce69eb8
commit 62c41d1d36
3 changed files with 17 additions and 7 deletions

View File

@ -1,5 +1,5 @@
name: ris-utils name: ris-utils
version: 0.0.2 version: 0.0.3
homepage: "https://git.fiskhamn.se/steffenomak/ris-utils#readme" homepage: "https://git.fiskhamn.se/steffenomak/ris-utils#readme"
license: BSD3 license: BSD3
author: "Stefan Risberg" author: "Stefan Risberg"

View File

@ -5,7 +5,7 @@ cabal-version: 1.12
-- see: https://github.com/sol/hpack -- see: https://github.com/sol/hpack
name: ris-utils name: ris-utils
version: 0.0.2 version: 0.0.3
description: Please see the README at <https://git.fiskhamn.se/steffenomak/ris-utils#readme> description: Please see the README at <https://git.fiskhamn.se/steffenomak/ris-utils#readme>
homepage: https://git.fiskhamn.se/steffenomak/ris-utils#readme homepage: https://git.fiskhamn.se/steffenomak/ris-utils#readme
author: Stefan Risberg author: Stefan Risberg

View File

@ -2,7 +2,8 @@
module Effects.Log ( module Effects.Log (
Severity (..), Severity (..),
runLogEff, runLog,
runLogWithQsem,
stderrLogger, stderrLogger,
fmtMessage, fmtMessage,
addTime, addTime,
@ -50,25 +51,34 @@ data Log :: Effect where
makeEffect ''Log makeEffect ''Log
runLogEff :: runLog ::
(Time :> es, Concurrent :> es, IOE :> es) => (Time :> es, Concurrent :> es, IOE :> es) =>
LogAction IO T.Builder -> LogAction IO T.Builder ->
Eff (Log : es) a -> Eff (Log : es) a ->
Eff es a Eff es a
runLogEff logger e = do runLog logger e = do
lock <- newQSem 1 lock <- newQSem 1
runLogWithQsem lock logger e
runLogWithQsem ::
(Time :> es, Concurrent :> es, IOE :> es) =>
QSem ->
LogAction IO T.Builder ->
Eff (Log : es) a ->
Eff es a
runLogWithQsem lock logger e = do
reinterpret reinterpret
(runReader lock) (runReader lock)
( \_ -> \case ( \_ -> \case
Log sev msg -> do Log sev msg -> do
l <- ask lock' <- ask
bracket_ (waitQSem l) (signalQSem l) $ do bracket_ (waitQSem lock') (signalQSem lock') $ do
t <- currentTimeB t <- currentTimeB
liftIO $ cmap (addTime t . fmtMessage) logger <& msg `WithSeverity` sev liftIO $ cmap (addTime t . fmtMessage) logger <& msg `WithSeverity` sev
) )
e e
stderrLogger :: stderrLogger ::
(MonadIO m) => (MonadIO m) =>
LogAction m T.Builder LogAction m T.Builder