workflow-osx-0.0.0: sources/Workflow/OSX/DSL.hs
{-# LANGUAGE FlexibleContexts, OverloadedStrings, RankNTypes #-}
{-# LANGUAGE TemplateHaskell, ViewPatterns #-}
-- | some higher-level workflows you can derive from the primitives in 'Workflow'. (also see the source)
module Workflow.OSX.DSL where
import Workflow.OSX.Types
import Control.Monad.Free (MonadFree, liftF)
import Control.Monad.Free.TH (makeFree)
import qualified Data.ByteString.Char8 as BS
import Network.HTTP.Types.URI (renderQuery)
import Data.Monoid ((<>))
makeFree ''WorkflowF
insert :: (MonadWorkflow m) => String -> m ()
insert = sendText
-- TODO
-- wait (25 ms)
-- wait $ 25 ms
-- wait (25ms)
--
-- ms :: TimeUnit
-- instance Num (TimeUnit -> Time)
-- instance Num (UnitOf a -> a)
--
-- module Commands.Compiler.Sugar where
-- I want "type = mapM_ (press . KeyChord [] . key)" to be "atomic" i.e. no delay between each step. I want "press (KeyChord [Command] RKey) >> type text" to be "laggy" i.e. some delay between each step. If I "instrument" some "Workflow", by interleaving "Wait 25" between each step i.e. each "Free _", I can't distinguish between groups of steps. Thus, I should manually insert "Wait 25" between any steps that need some lag, or "automate it locally" in helper functions, but not "automate it globally" by interleaving.
-- | access the currently selected region from Haskell, via the clipboard
copy :: (MonadWorkflow m) => m String
copy = do
sendKeyChord [CommandModifier] CKey
delay 100 -- TODO how long does it need to wait?
getClipboard
paste :: (MonadWorkflow m) => m ()
paste = do
sendKeyChord [CommandModifier] VKey
-- | google a query. properly encodes the url.
google :: (MonadWorkflow m) => String -> m ()
google (BS.pack -> query) = openURL (BS.unpack $ "https://www.google.com/search" <> renderQuery True [("q", Just query)])
-- TODO
-- instance convert KeyChord Workflow
-- instance convert MouseClick Workflow
-- doubleClick :: AMonadWorkflow_
-- doubleClick = clickMouse [] LeftButton 2
-- rightClick :: AMonadWorkflow_
-- rightClick = clickMouse [] RightButton 1