-- |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 resource GtkClipboard !! Text, Log, Embed IO, Final IO] r =>
  InterpreterFor (XClipboard !! Text) r
interpretXClipboardGtk :: InterpreterFor (XClipboard !! Text) r
interpretXClipboardGtk = do
  (forall x (r0 :: EffectRow).
 XClipboard (Sem r0) x -> Sem (Stop Text : r) x)
-> InterpreterFor (XClipboard !! Text) r
forall err (eff :: Effect) (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 ->
      Sem (Scoped resource GtkClipboard : Stop Text : r) (Maybe Text)
-> Sem (Stop Text : r) (Maybe Text)
forall err (eff :: Effect) (r :: EffectRow).
Members '[Resumable err eff, Stop err] r =>
InterpreterFor eff r
restop (Sem (Scoped resource GtkClipboard : Stop Text : r) (Maybe Text)
 -> Sem (Stop Text : r) (Maybe Text))
-> Sem (Scoped resource GtkClipboard : Stop Text : r) (Maybe Text)
-> Sem (Stop Text : r) (Maybe Text)
forall a b. (a -> b) -> a -> b
$ Sem
  (GtkClipboard : Scoped resource GtkClipboard : Stop Text : r)
  (Maybe Text)
-> Sem (Scoped resource GtkClipboard : Stop Text : r) (Maybe Text)
forall resource (r :: EffectRow).
Member (Scoped resource GtkClipboard) r =>
InterpreterFor GtkClipboard r
withGtkClipboard do
        Selection
-> Sem
     (GtkClipboard : Scoped resource GtkClipboard : Stop Text : r)
     (Maybe Text)
forall (r :: EffectRow).
Member GtkClipboard r =>
Selection -> Sem r (Maybe Text)
GtkClipboard.read Selection
Clipboard
    Set text ->
      Sem (Scoped resource GtkClipboard : Stop Text : r) ()
-> Sem (Stop Text : r) ()
forall err (eff :: Effect) (r :: EffectRow).
Members '[Resumable err eff, Stop err] r =>
InterpreterFor eff r
restop (Sem (Scoped resource GtkClipboard : Stop Text : r) ()
 -> Sem (Stop Text : r) ())
-> Sem (Scoped resource GtkClipboard : Stop Text : r) ()
-> Sem (Stop Text : r) ()
forall a b. (a -> b) -> a -> b
$ Sem
  (GtkClipboard : Scoped resource GtkClipboard : Stop Text : r) ()
-> Sem (Scoped resource GtkClipboard : Stop Text : r) ()
forall resource (r :: EffectRow).
Member (Scoped resource GtkClipboard) r =>
InterpreterFor GtkClipboard r
withGtkClipboard do
        (Selection
-> Text
-> Sem
     (GtkClipboard : Scoped resource GtkClipboard : Stop Text : r) ()
forall (r :: EffectRow).
Member GtkClipboard r =>
Selection -> Text -> Sem r ()
GtkClipboard.write Selection
Clipboard Text
text)
    Sync _ Clipboard ->
      Sem (Stop Text : r) x
forall (f :: * -> *). Applicative f => f ()
unit
    Sync text _ ->
      Sem (Scoped resource GtkClipboard : Stop Text : r) ()
-> Sem (Stop Text : r) ()
forall err (eff :: Effect) (r :: EffectRow).
Members '[Resumable err eff, Stop err] r =>
InterpreterFor eff r
restop (Sem (Scoped resource GtkClipboard : Stop Text : r) ()
 -> Sem (Stop Text : r) ())
-> Sem (Scoped resource GtkClipboard : Stop Text : r) ()
-> Sem (Stop Text : r) ()
forall a b. (a -> b) -> a -> b
$ Sem
  (GtkClipboard : Scoped resource GtkClipboard : Stop Text : r) ()
-> Sem (Scoped resource GtkClipboard : Stop Text : r) ()
forall resource (r :: EffectRow).
Member (Scoped resource GtkClipboard) r =>
InterpreterFor GtkClipboard r
withGtkClipboard do
        Selection
-> Text
-> Sem
     (GtkClipboard : Scoped resource GtkClipboard : Stop Text : r) ()
forall (r :: EffectRow).
Member GtkClipboard r =>
Selection -> Text -> Sem r ()
GtkClipboard.write Selection
Clipboard Text
text