-- |Interpreter for 'XClipboard' using GTK.
-- Internal.
module Helic.Interpreter.XClipboard where

import Helic.Data.Selection (Selection (Clipboard))
import qualified Helic.Effect.GtkClipboard as GtkClipboard
import Helic.Effect.GtkClipboard (GtkClipboard)
import Helic.Effect.XClipboard (XClipboard (Current, Set, Sync))
import Helic.Interpreter.GtkClipboard (withGtkClipboard)

-- |Interpret 'XClipboard' using a GTK backend.
-- This uses the library @gi-gtk@ to access the X11 clipboard.
interpretXClipboardGtk ::
  Members [Scoped_ GtkClipboard !! Text, Log, Embed IO, Final IO] r =>
  InterpreterFor (XClipboard !! Text) r
interpretXClipboardGtk :: forall (r :: EffectRow).
Members
  '[Scoped_ GtkClipboard !! Text, Log, Embed IO, Final IO] r =>
InterpreterFor (XClipboard !! Text) r
interpretXClipboardGtk = do
  forall err (eff :: (* -> *) -> * -> *) (r :: EffectRow).
FirstOrder eff "interpretResumable" =>
(forall x (r0 :: EffectRow).
 eff (Sem r0) x -> Sem (Stop err : r) x)
-> InterpreterFor (Resumable err eff) r
interpretResumable \case
    XClipboard (Sem r0) x
Current ->
      forall err (eff :: (* -> *) -> * -> *) (r :: EffectRow).
Members '[Resumable err eff, Stop err] r =>
InterpreterFor eff r
restop forall a b. (a -> b) -> a -> b
$ forall (r :: EffectRow).
Member (Scoped_ GtkClipboard) r =>
InterpreterFor GtkClipboard r
withGtkClipboard do
        forall (r :: EffectRow).
Member GtkClipboard r =>
Selection -> Sem r (Maybe Text)
GtkClipboard.read Selection
Clipboard
    Set Text
text ->
      forall err (eff :: (* -> *) -> * -> *) (r :: EffectRow).
Members '[Resumable err eff, Stop err] r =>
InterpreterFor eff r
restop forall a b. (a -> b) -> a -> b
$ forall (r :: EffectRow).
Member (Scoped_ GtkClipboard) r =>
InterpreterFor GtkClipboard r
withGtkClipboard do
        (forall (r :: EffectRow).
Member GtkClipboard r =>
Selection -> Text -> Sem r ()
GtkClipboard.write Selection
Clipboard Text
text)
    Sync Text
_ Selection
Clipboard ->
      forall (f :: * -> *). Applicative f => f ()
unit
    Sync Text
text Selection
_ ->
      forall err (eff :: (* -> *) -> * -> *) (r :: EffectRow).
Members '[Resumable err eff, Stop err] r =>
InterpreterFor eff r
restop forall a b. (a -> b) -> a -> b
$ forall (r :: EffectRow).
Member (Scoped_ GtkClipboard) r =>
InterpreterFor GtkClipboard r
withGtkClipboard do
        forall (r :: EffectRow).
Member GtkClipboard r =>
Selection -> Text -> Sem r ()
GtkClipboard.write Selection
Clipboard Text
text