module BishBosh.UI.PrintObject (
PrintObject(..),
boardTag,
configurationTag,
fenTag,
gameTag,
helpTag,
movesTag,
pgnTag,
range,
autoComplete
) where
import qualified Control.Arrow
import qualified Control.DeepSeq
import qualified Data.Char
import qualified Data.List
import qualified Data.List.Extra
boardTag :: String
boardTag :: String
boardTag = String
"board"
configurationTag :: String
configurationTag :: String
configurationTag = String
"configuration"
fenTag :: String
fenTag :: String
fenTag = String
"fen"
gameTag :: String
gameTag :: String
gameTag = String
"game"
helpTag :: String
helpTag :: String
helpTag = String
"help"
movesTag :: String
movesTag :: String
movesTag = String
"moves"
pgnTag :: String
pgnTag :: String
pgnTag = String
"pgn"
data PrintObject
= Board
| Configuration
| FEN
| Game
| Help
| Moves
| PGN
deriving PrintObject -> PrintObject -> Bool
(PrintObject -> PrintObject -> Bool)
-> (PrintObject -> PrintObject -> Bool) -> Eq PrintObject
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PrintObject -> PrintObject -> Bool
$c/= :: PrintObject -> PrintObject -> Bool
== :: PrintObject -> PrintObject -> Bool
$c== :: PrintObject -> PrintObject -> Bool
Eq
instance Control.DeepSeq.NFData PrintObject where
rnf :: PrintObject -> ()
rnf PrintObject
_ = ()
instance Show PrintObject where
showsPrec :: Int -> PrintObject -> ShowS
showsPrec Int
_ PrintObject
printObject = String -> ShowS
showString (String -> ShowS) -> String -> ShowS
forall a b. (a -> b) -> a -> b
$ case PrintObject
printObject of
PrintObject
Board -> String
boardTag
PrintObject
Configuration -> String
configurationTag
PrintObject
FEN -> String
fenTag
PrintObject
Game -> String
gameTag
PrintObject
Help -> String
helpTag
PrintObject
Moves -> String
movesTag
PrintObject
PGN -> String
pgnTag
instance Read PrintObject where
readsPrec :: Int -> ReadS PrintObject
readsPrec Int
_ String
s = case ShowS -> (String, String) -> (String, String)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
Control.Arrow.first ShowS
Data.List.Extra.lower ((String, String) -> (String, String))
-> [(String, String)] -> [(String, String)]
forall a b. (a -> b) -> [a] -> [b]
`map` ReadS String
lex String
s of
[(String
"board", String
remainder)] -> [(PrintObject
Board, String
remainder)]
[(String
"configuration", String
remainder)] -> [(PrintObject
Configuration, String
remainder)]
[(String
"fen", String
remainder)] -> [(PrintObject
FEN, String
remainder)]
[(String
"game", String
remainder)] -> [(PrintObject
Game, String
remainder)]
[(String
"help", String
remainder)] -> [(PrintObject
Help, String
remainder)]
[(String
"moves", String
remainder)] -> [(PrintObject
Moves, String
remainder)]
[(String
"pgn", String
remainder)] -> [(PrintObject
PGN, String
remainder)]
[(String, String)]
_ -> []
range :: [PrintObject]
range :: [PrintObject]
range = [PrintObject
Board, PrintObject
Configuration, PrintObject
FEN, PrintObject
Game, PrintObject
Help, PrintObject
Moves, PrintObject
PGN]
autoComplete :: ShowS
autoComplete :: ShowS
autoComplete = (String -> ShowS) -> (String, String) -> String
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry String -> ShowS
forall a. [a] -> [a] -> [a]
(++) ((String, String) -> String)
-> (String -> (String, String)) -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS -> (String, String) -> (String, String)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
Control.Arrow.first (
\String
word -> case [
String
tag |
String
tag <- [
String
boardTag,
String
configurationTag,
String
fenTag,
String
gameTag,
String
helpTag,
String
movesTag
],
ShowS
Data.List.Extra.lower String
word String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`Data.List.isPrefixOf` ShowS
Data.List.Extra.lower String
tag
] of
[String
tag] -> String
tag
[String]
_ -> String
word
) ((String, String) -> (String, String))
-> (String -> (String, String)) -> String -> (String, String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
break Char -> Bool
Data.Char.isSpace (String -> (String, String)) -> ShowS -> String -> (String, String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
Data.List.Extra.trimStart