-----------------------------------------------------------------------------
-- |
-- Module      :  XMonad.Prompt.Directory
-- Description :  A directory prompt for XMonad.
-- Copyright   :  (C) 2007 Andrea Rossato, David Roundy
-- License     :  BSD3
--
-- Maintainer  :
-- Stability   :  unstable
-- Portability :  unportable
--
-- A directory prompt for XMonad
--
-----------------------------------------------------------------------------

module XMonad.Prompt.Directory (
                             -- * Usage
                             -- $usage
                             directoryPrompt,
                             directoryMultipleModes,
                             directoryMultipleModes',
                             Dir
                              ) where

import XMonad.Prelude ( sort )

import XMonad
import XMonad.Prompt
import XMonad.Prompt.Shell ( compgenDirectories )

-- $usage
-- For an example usage see "XMonad.Layout.WorkspaceDir"

data Dir = Dir String ComplCaseSensitivity (String -> X ())

instance XPrompt Dir where
    showXPrompt :: Dir -> String
showXPrompt (Dir String
x ComplCaseSensitivity
_ String -> X ()
_) = String
x
    completionFunction :: Dir -> ComplFunction
completionFunction (Dir String
_ ComplCaseSensitivity
csn String -> X ()
_) = ComplCaseSensitivity -> ComplFunction
getDirCompl ComplCaseSensitivity
csn
    modeAction :: Dir -> String -> String -> X ()
modeAction (Dir String
_ ComplCaseSensitivity
_ String -> X ()
f) String
buf String
auto =
      let dir :: String
dir = if String -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
auto then String
buf else String
auto
      in String -> X ()
f String
dir

directoryPrompt :: XPConfig -> String -> (String -> X ()) -> X ()
directoryPrompt :: XPConfig -> String -> (String -> X ()) -> X ()
directoryPrompt XPConfig
c String
prom String -> X ()
f = Dir -> XPConfig -> ComplFunction -> (String -> X ()) -> X ()
forall p.
XPrompt p =>
p -> XPConfig -> ComplFunction -> (String -> X ()) -> X ()
mkXPrompt (String -> ComplCaseSensitivity -> (String -> X ()) -> Dir
Dir String
prom ComplCaseSensitivity
csn String -> X ()
f) XPConfig
c (ComplCaseSensitivity -> ComplFunction
getDirCompl ComplCaseSensitivity
csn) String -> X ()
f
    where csn :: ComplCaseSensitivity
csn = XPConfig -> ComplCaseSensitivity
complCaseSensitivity XPConfig
c

-- | A @XPType@ entry suitable for using with @mkXPromptWithModes@.
directoryMultipleModes :: String            -- ^ Prompt.
                       -> (String -> X ())  -- ^ Action.
                       -> XPType
directoryMultipleModes :: String -> (String -> X ()) -> XPType
directoryMultipleModes = ComplCaseSensitivity -> String -> (String -> X ()) -> XPType
directoryMultipleModes' ComplCaseSensitivity
CaseSensitive

-- | Like @directoryMultipleModes@ with a parameter for completion case-sensitivity.
directoryMultipleModes' :: ComplCaseSensitivity -- ^ Completion case sensitivity.
                        -> String               -- ^ Prompt.
                        -> (String -> X ())     -- ^ Action.
                        -> XPType
directoryMultipleModes' :: ComplCaseSensitivity -> String -> (String -> X ()) -> XPType
directoryMultipleModes' ComplCaseSensitivity
csn String
p String -> X ()
f = Dir -> XPType
forall p. XPrompt p => p -> XPType
XPT (String -> ComplCaseSensitivity -> (String -> X ()) -> Dir
Dir String
p ComplCaseSensitivity
csn String -> X ()
f)

getDirCompl :: ComplCaseSensitivity -> String -> IO [String]
getDirCompl :: ComplCaseSensitivity -> ComplFunction
getDirCompl ComplCaseSensitivity
csn String
s = [String] -> [String]
forall a. Ord a => [a] -> [a]
sort ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter String -> Bool
notboring ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
lines (String -> [String]) -> IO String -> IO [String]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ComplCaseSensitivity -> String -> IO String
compgenDirectories ComplCaseSensitivity
csn String
s

notboring :: String -> Bool
notboring :: String -> Bool
notboring (Char
'.':Char
'.':String
_) = Bool
True
notboring (Char
'.':String
_) = Bool
False
notboring String
_ = Bool
True