Compare commits

..

2 commits

Author SHA1 Message Date
3cd99e3f0b Add 'doctest' as a cabal test
We provide a simple wrapper that executes `doctest` on our `src`
directory. This allows us to run all doctests during a regular `cabal
test` run.
2023-08-29 23:28:49 +02:00
8b1755425c Implement utility functions to deal with the user
- getTerminalSize -> returns the dimensions of the terminal
- getUserCommand -> returns input from the user. We currently support
- ``NextPage`` and `Quit`.

Implement getTerminalSize via 'tput'
2023-08-29 23:27:18 +02:00

View file

@ -4,6 +4,8 @@ module HCat.Internal where
import Data.Text (Text)
import Data.Text qualified as T
import System.IO
import System.Info qualified as SysInfo
import System.Process qualified as P
-- | @parseArgs@ takes a list of strings and returns a single FilePath if there was exactly one element.
@ -70,7 +72,28 @@ paginate (ScreenDimensions rows cols) =
type Pages = [Page]
type Page = Text
getScreenDimensions :: IO ScreenDimensions
getScreenDimensions = ScreenDimensions <$> tput "lines" <*> tput "cols"
getTerminalSize :: IO ScreenDimensions
getTerminalSize = case SysInfo.os of
"linux" -> tputScreenDimensions
"darwin" -> tputScreenDimensions
_ -> pure $ defaultScreenDimensions{screenRows = 25, screenColumns = 80}
defaultScreenDimensions :: ScreenDimensions
defaultScreenDimensions = ScreenDimensions{screenRows = 25, screenColumns = 80}
tputScreenDimensions :: IO ScreenDimensions
tputScreenDimensions = ScreenDimensions <$> tput "lines" <*> tput "cols"
where
tput cmd = read <$> P.readProcess "tput" [cmd] ""
data UserCommand = NextPage | Quit deriving (Show)
getUserCommand :: IO UserCommand
getUserCommand = do
hSetBuffering stdin NoBuffering
hSetEcho stdin False
input <- getChar
case input of
' ' -> pure NextPage
'q' -> pure Quit
_ -> getUserCommand