{-# LANGUAGE OverloadedStrings #-} module Hsm.Core.Zmq ( withSocket ) where 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 :: (Z.SocketType t, IOE :> es, Log :> es, Resource :> es) => t -> Eff es (Z.Socket t) withSocket stype = withLogIO >>= bracket where bracket logIO = snd . snd <$> allocate acquire release where acquire = logIO LogTrace "Acquiring ZMQ context" >> do cont <- Z.context sock <- Z.socket cont stype return (cont, sock) release (cont, sock) = logIO LogTrace "Releasing ZMQ context" >> do Z.close sock Z.shutdown cont