-- |Utilities for 'GtkClipboard'.
-- Internal.
module Helic.GtkClipboard where

import Exon (exon)
import qualified Polysemy.Log as Log

import Helic.Data.XClipboardEvent (XClipboardEvent (XClipboardEvent))
import qualified Helic.Effect.GtkClipboard as GtkClipboard
import Helic.Effect.GtkClipboard (GtkClipboard)
import Helic.Interpreter.GtkClipboard (withGtkClipboard)

-- |Registers a callback with GTK's clipboard event system that converts each update into an 'XClipboardEvent' published
-- through 'Events'.
subscribeEvents ::
  Members [Scoped s GtkClipboard !! Text, Events res XClipboardEvent, Log] r =>
  Sem r ()
subscribeEvents :: Sem r ()
subscribeEvents =
  (Text -> Sem r ())
-> Sem (Scoped s GtkClipboard : r) () -> Sem r ()
forall err (eff :: (* -> *) -> * -> *) (r :: EffectRow) a.
Member (Resumable err eff) r =>
(err -> Sem r a) -> Sem (eff : r) a -> Sem r a
resuming Text -> Sem r ()
forall (r :: EffectRow). Member Log r => Text -> Sem r ()
failure (Sem (Scoped s GtkClipboard : r) () -> Sem r ())
-> Sem (Scoped s GtkClipboard : r) () -> Sem r ()
forall a b. (a -> b) -> a -> b
$ Sem (GtkClipboard : Scoped s GtkClipboard : r) ()
-> Sem (Scoped s GtkClipboard : r) ()
forall resource (r :: EffectRow).
Member (Scoped resource GtkClipboard) r =>
InterpreterFor GtkClipboard r
withGtkClipboard do
    (Selection
 -> Text -> Sem (GtkClipboard : Scoped s GtkClipboard : r) ())
-> Sem (GtkClipboard : Scoped s GtkClipboard : r) ()
forall (r :: EffectRow).
Member GtkClipboard r =>
(Selection -> Text -> Sem r ()) -> Sem r ()
GtkClipboard.events \ Selection
selection Text
t ->
      XClipboardEvent
-> Sem (GtkClipboard : Scoped s GtkClipboard : r) ()
forall e resource (r :: EffectRow).
Member (Events resource e) r =>
e -> Sem r ()
publish (Text -> Selection -> XClipboardEvent
XClipboardEvent Text
t Selection
selection)
  where
    failure :: Text -> Sem r ()
failure Text
e =
      Text -> Sem r ()
forall (r :: EffectRow).
(HasCallStack, Member Log r) =>
Text -> Sem r ()
Log.error [exon|Subscribing to Gtk events failed: #{e}|]