{-# LANGUAGE FlexibleContexts #-}
-- | Designed to be imported as @qualified@.
module Hbro.Clipboard where

-- {{{ Imports
-- import Hbro.Core
import Hbro.Types
import Hbro.Util

import Control.Monad.Error
import Control.Monad.IO.Class
import Control.Monad.Trans.Control

import Graphics.UI.Gtk.General.Clipboard
-- }}}


--requestText :: (ClipboardClass a, MonadIO m, MonadError HError m, MonadBaseControl IO m) => a -> ClipboardHook -> m ()
requestText clip f = liftBaseWith $ \runInIO -> clipboardRequestText clip $ \x -> void . runInIO . maybe (throwError $ OtherError "Empty clipboard") f $ x

-- | Write given String to primary clipboard.
insert :: (MonadIO m) => String -> m ()
insert text = io $ clipboardGet selectionPrimary >>= (`clipboardSetText` text)

with :: (MonadIO m, MonadBaseControl IO m, MonadError HError m) => (String -> m ()) -> m ()
with f = do
    clip <- io $ clipboardGet selectionPrimary
    requestText clip f