Dotfiles/home/xmonad/.xmonad/lib/TaskMonad/Utils.hs

2744 lines
35 KiB
Haskell

{-# LANGUAGE ScopedTypeVariables, TypeSynonymInstances, FlexibleInstances #-}
-----------------------------------------------------------------------------
-- |
-- Module : TaskMonad.Utils
-- Copyright : Max Magorsch <max@magorsch.de>
-- License : BSD-style (see LICENSE)
--
-- Maintainer : Max Magorsch <max@magorsch.de>
-- Stability : unstable
-- Portability : unportable
--
-- TaskMonad.Utils bundles a number of help functions that can be used to
-- interact with the taskwarrior command line application.
--
-----------------------------------------------------------------------------
module TaskMonad.Utils
( getTaskwarriorTaskList
, getTaskwarriorIds
, isTWReport
, defaulttwreports
, execCommand
, execCommandWithOutput
, twicon
)
where
import Data.List
import Data.Maybe
import System.Process
import System.IO
import Control.Monad ( filterM )
import XMonad hiding ( liftX )
import XMonad.Util.Font
import qualified XMonad.StackSet as W
import XMonad.Layout.Decoration
import XMonad.Prompt
import XMonad.Prompt.Input
import XMonad.Util.Image
import XMonad.Util.NamedWindows
import XMonad.Util.XUtils
import XMonad.Util.NamedScratchpad
import XMonad.Util.Run
import XMonad.Actions.GridSelect
-- | Returns a filtered list of all properties that belong to a given category. For example
--
-- > getTaskwarriorIds "status:pending" "tags"
--
-- returns a list of all tags of the pending tasks. Likewise
--
-- > getTaskwarriorIds "status:pending" "ids"
--
-- returns the ids of all pending tasks.
getTaskwarriorIds
:: String -- ^ A filter that is applied, e.g. "+INBOX" or "status:pending". Please refer to the [taskwarrior documentation](https://taskwarrior.org/docs/filter.html) for further information.
-> String -- ^ The category of properties that should be returned, e.g. "ids" or "tags"
-> IO [String] -- ^ A filtered list of all properties that belong to the specified category
getTaskwarriorIds filter category = do
result <- execCommandWithOutput "task" (filter ++ " _" ++ category)
return $ lines result
-- | Get a tuple containing the id and the description of a task with a specified id
getTaskwarriorTaskDescription
:: String -- ^ the id of the task
-> IO (String, String) -- ^ (the id of the task, the description)
getTaskwarriorTaskDescription id = do
result <- execCommandWithOutput "task" ("_get " ++ id ++ ".description")
return (id, result)
-- | Get the description of a task with a specified id
getTaskDescription
:: String -- ^ the id of the task
-> IO String -- ^ the description of the task
getTaskDescription id =
execCommandWithOutput "task" ("_get " ++ id ++ ".description")
-- | Returns a filtered list of tasks that contains the specified properties of each task
getTaskwarriorTaskList
:: String -- ^ A filter that is applied, e.g. "+INBOX" or "status:pending". Please refer to the [taskwarrior documentation](https://taskwarrior.org/docs/filter.html) for further information.
-> [String] -- ^ A list of properties that should be retrieved for each task, e.g. ["id", "description", "tags"]
-> IO [[String]] -- ^ A filtered list of tasks that contains the specified properties of each task
getTaskwarriorTaskList filter taskproperties = do
ids <- getTaskwarriorIds filter "ids"
traverse (getTaskwarriorTaskProperties taskproperties) ids
-- | Get a list of specified properties of a task with a specified id
getTaskwarriorTaskProperties
:: Traversable t
=> t String -- ^ a list of properties
-> String -- ^ the id of the task
-> IO (t String) -- ^ the list containing the values of the specified properties
getTaskwarriorTaskProperties properties id =
traverse (getTaskwarriorTaskProperty id) properties
-- | Get a specified property of a task with a specified id
getTaskwarriorTaskProperty
:: String -- ^ the id of the task
-> String -- ^ the desired property
-> IO String -- ^ the value of the desired property of the specified task
getTaskwarriorTaskProperty id property = do
result <- execCommandWithOutput "task" ("_get " ++ id ++ "." ++ property)
return $ filter (/= '\n') result
-- | Checks whether a given taskwarrior command is a report or not
isTWReport :: String -> Bool
isTWReport command = head (words command) `elem` defaulttwreports
-- | A list containing all taskwarrior reports. For further information, please refer to [https://taskwarrior.org/docs/report.html](https://taskwarrior.org/docs/report.html)
defaulttwreports :: [String]
defaulttwreports =
[ "dailyreview"
, "weeklyreview"
, "inbox"
, "processInbox"
, "process"
, "active"
, "all"
, "blocked"
, "blocking"
, "completed"
, "done"
, "list"
, "long"
, "ls"
, "minimal"
, "newest"
, "next"
, "oldest"
, "overdue"
, "ready"
, "recurring"
, "unblocked"
, "waiting"
, "burndown.daily"
, "burndown.monthly"
, "burndown.weekly"
, "calendar"
, "colors"
, "columns"
, "commands"
, "diagnostics"
, "ghistory.annual"
, "ghistory.monthly"
, "ghistory.weekly"
, "ghistory.daily"
, "history.annual"
, "history.monthly"
, "history.weekly"
, "history.daily"
, "ids"
, "information"
, "projects"
, "reports"
, "show"
, "stats"
, "summary"
, "tags"
, "timesheet"
, "udas"
, "uuids"
]
-- | Executes a shell command.
execCommand :: MonadIO m => String -> m ()
execCommand = unsafeSpawn
-- | Executes an executable with args and returns the output.
execCommandWithOutput :: FilePath -> String -> IO String
execCommandWithOutput executable args = do
(_, Just hout, _, _) <- createProcess (proc executable (words args))
{ std_out = CreatePipe
}
hGetContents hout
-- | The Taskwarrior icon
twicon :: [[Bool]]
twicon =
[ [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, True
, True
, False
, False
, False
, False
, True
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, True
, False
, False
, False
, False
, True
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, True
, True
, False
, False
, False
, False
, True
, True
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, True
, False
, False
, False
, False
, True
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
, [ False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
, False
]
]