{-# 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