brick-0.24.1: programs/Testing.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ViewPatterns #-}
module Main where
import Control.Monad (void)
import Data.Function ((&))
import Data.Function (on)
import Data.List (transpose)
import qualified Brick as B
import qualified Brick.Widgets.Core as B
import qualified Brick.Widgets.Border as B
import qualified Brick.Widgets.Center as B
import qualified Graphics.Vty as V
type Name = ()
data Tick
data Game
app :: B.App Game Tick Name
app = B.App
{ B.appDraw = drawUI
, B.appChooseCursor = B.neverShowCursor
, B.appHandleEvent = handleEvent
, B.appStartEvent = pure
, B.appAttrMap = const theMap
}
theMap :: B.AttrMap
theMap = B.attrMap V.defAttr
[ (blackSquare, go V.withBackColor V.black)
, (redSquare, go V.withBackColor V.red)
]
where
go a b = a V.defAttr b
blackSquare, redSquare :: B.AttrName
blackSquare = "blackSquare"
redSquare = "redSquare"
vkey :: B.BrickEvent Name Tick -> Maybe V.Key
vkey (B.VtyEvent (V.EvKey y [])) = Just y
vkey _ = Nothing
handleEvent :: Game -> B.BrickEvent Name Tick -> B.EventM Name (B.Next Game)
handleEvent g (vkey -> Just (V.KChar 'q')) = g & B.halt
handleEvent g (vkey -> Just (V.KEsc)) = g & B.halt
handleEvent g (vkey -> Nothing) = g & B.continue
handleEvent g _ = g & B.continue
drawUI :: Game -> [B.Widget Name]
drawUI = pure . drawBoard
boardNumbers :: Game -> [[B.Widget Name]]
boardNumbers _ =
board
where
(.:) = (.) . (.)
ap = take 8 .: zipC `on` repeat
board = ap oddRows evenRows
oddRows = ap reds blacks
evenRows = ap blacks reds
zipC = (concat . transpose) .: mappend `on` pure
pattern p = B.withAttr p . B.center . B.str $ " "
reds = pattern redSquare
blacks = pattern blackSquare
drawBoard :: Game -> B.Widget Name
drawBoard = B.border . B.vBox . fmap B.hBox . boardNumbers
main :: IO ()
main = void $ B.defaultMain app undefined