module Effectful.Notify.Internal.Os.Linux
  ( initNotifyEnv,
    notify,
  )
where

import Effectful.Notify.Internal.Data.Note (Note)
import Effectful.Notify.Internal.Data.NotifyEnv
  ( NotifyEnv (NotifyEnvDBus, NotifyEnvNotifySend),
  )
import Effectful.Notify.Internal.Data.NotifySystem
  ( NotifySystemOs (NotifySystemOsDBus, NotifySystemOsNotifySend),
  )
import Effectful.Notify.Internal.System.DBus qualified as DBus
import Effectful.Notify.Internal.System.NotifySend qualified as NotifySend
import GHC.Stack.Types (HasCallStack)

initNotifyEnv :: (HasCallStack) => NotifySystemOs -> IO NotifyEnv
initNotifyEnv :: HasCallStack => NotifySystemOs -> IO NotifyEnv
initNotifyEnv = \case
  NotifySystemOs
NotifySystemOsDBus -> Client -> NotifyEnv
NotifyEnvDBus (Client -> NotifyEnv) -> IO Client -> IO NotifyEnv
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO Client
HasCallStack => IO Client
DBus.initNotifyEnv
  NotifySystemOs
NotifySystemOsNotifySend -> NotifyEnv -> IO NotifyEnv
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure NotifyEnv
NotifyEnvNotifySend

notify :: NotifyEnv -> Note -> IO ()
notify :: NotifyEnv -> Note -> IO ()
notify NotifyEnv
env Note
note = case NotifyEnv
env of
  NotifyEnvDBus Client
client -> HasCallStack => Client -> Note -> IO ()
Client -> Note -> IO ()
DBus.notify Client
client Note
note
  NotifyEnv
NotifyEnvNotifySend -> Note -> IO ()
NotifySend.notify Note
note