module Service.Notification
( Notifications(..)
, initNotifications
, triggerNotifications
) where
import Control.Concurrent.MVar (MVar, newMVar, tryPutMVar, tryTakeMVar)
import Control.Monad (unless)
import qualified Data.ByteString as BS
import qualified Text.Regex.Posix as Regex
import Model.Periodic (Period)
import qualified Store.Config as C
data Notifications = Notifications
{ notificationsTrigger :: !(MVar (Maybe Period))
, notificationsFilter :: !Regex.Regex
, notificationsCopy :: !(Maybe BS.ByteString)
}
initNotifications :: C.Config -> IO Notifications
initNotifications conf = do
t <- newMVar Nothing
return Notifications
{ notificationsTrigger = t
, notificationsFilter = Regex.makeRegexOpts Regex.compIgnoreCase Regex.blankExecOpt (conf C.! "filter" :: BS.ByteString)
, notificationsCopy = conf C.! "copy"
}
triggerNotifications :: Maybe Period -> Notifications -> IO ()
triggerNotifications p Notifications{ notificationsTrigger = t } = write p where
write x = do
r <- tryPutMVar t x
unless r $ do
y <- tryTakeMVar t
write $ maybe id max y x