diff options
Diffstat (limited to 'hsm-core/Hsm/Core/Zmq.hs')
| -rw-r--r-- | hsm-core/Hsm/Core/Zmq.hs | 34 | 
1 files changed, 34 insertions, 0 deletions
| diff --git a/hsm-core/Hsm/Core/Zmq.hs b/hsm-core/Hsm/Core/Zmq.hs new file mode 100644 index 0000000..8c12133 --- /dev/null +++ b/hsm-core/Hsm/Core/Zmq.hs @@ -0,0 +1,34 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Hsm.Core.Zmq +  ( withSocket +  ) where + +import Data.Text (Text) +import Effectful (Eff, IOE, (:>)) +import Effectful.Log (Log, LogLevel(LogTrace)) +import Effectful.Resource (Resource, allocate) +import Hsm.Core.Log (withLogIO) +import System.ZMQ4 qualified as Z + +withSocket :: +     forall t es. (Z.SocketType t, IOE :> es, Log :> es, Resource :> es) +  => t +  -> Eff es (Z.Socket t) +withSocket stype = withLogIO >>= bracket +  where +    bracket :: (LogLevel -> Text -> IO ()) -> Eff es (Z.Socket t) +    bracket logIO = snd . snd <$> allocate acquire release +      where +        acquire :: IO (Z.Context, Z.Socket t) +        acquire = do +          logIO LogTrace "Acquiring ZMQ context" +          cont <- Z.context +          sock <- Z.socket cont stype +          return (cont, sock) +        -- +        release :: (Z.Context, Z.Socket t) -> IO () +        release (cont, sock) = do +          logIO LogTrace "Releasing ZMQ context" +          Z.close sock +          Z.shutdown cont | 
