packages feed

termbox-0.1.0: examples/Colors.hs

-- | Something like https://github.com/nsf/termbox/blob/8b72969ff4bba120d8b8e4a29bae07102ed71055/src/demo/output.c

{-# language LambdaCase #-}

import Control.Monad
import Data.Foldable

import qualified Termbox as Tb

main :: IO ()
main = do
  Tb.main $ do
    clear

    do
      let
        rectangles :: [(Int, Int, Int, Int)]
        rectangles = do
          y0 <- [0, 4 ..]
          x0 <- [0, 8 .. 24]
          pure (x0, y0, x0+7, y0+3)

      let
        colors :: [(String, Tb.Attr, Tb.Attr)]
        colors =
          [ ("black", Tb.black, Tb.white)
          , ("red", Tb.red, Tb.black)
          , ("green", Tb.green, Tb.black)
          , ("yellow", Tb.yellow, Tb.black)
          , ("blue", Tb.blue, Tb.black)
          , ("magenta", Tb.magenta, Tb.black)
          , ("cyan", Tb.cyan, Tb.black)
          , ("white", Tb.white, Tb.black)
          ]

      zipWithM_
        (\(x0, y0, x1, y1) (name, bg, fg) -> do
          rectangle x0 y0 x1 y1 (Tb.Cell ' ' mempty bg)
          string x0 y0 fg bg name)
        rectangles
        colors

    Tb.flush
    _ <- Tb.poll

    clear
    Tb.setOutputMode Tb.OutputModeGrayscale

    do
      let
        rectangles :: [(Int, Int, Int, Int)]
        rectangles = do
          y0 <- [0, 4 ..]
          x0 <- [0, 8 .. 40]
          pure (x0, y0, x0+7, y0+3)

      zipWithM_
        (\(x0, y0, x1, y1) n -> do
          rectangle x0 y0 x1 y1 (Tb.Cell ' ' mempty (fromInteger n))
          string x0 y0 12 (fromInteger n) (show n))
        rectangles
        [1..23]

    Tb.flush
    _ <- Tb.poll

    clear
    Tb.setOutputMode Tb.OutputMode216

    do
      let
        rectangles :: [(Int, Int, Int, Int)]
        rectangles = do
          y0 <- [0, 2..]
          x0 <- [0, 4 .. 40]
          pure (x0, y0, x0+3, y0+1)

      zipWithM_
        (\(x0, y0, x1, y1) n -> do
          rectangle x0 y0 x1 y1 (Tb.Cell ' ' mempty (fromInteger n))
          string x0 y0 2 (fromInteger n) (show n))
        rectangles
        [1..216]

    Tb.flush
    _ <- Tb.poll

    pure ()

clear :: IO ()
clear = do
  mode <- Tb.getOutputMode
  Tb.setOutputMode Tb.OutputModeNormal
  Tb.clear mempty mempty
  Tb.flush
  Tb.setOutputMode mode

string :: Int -> Int -> Tb.Attr -> Tb.Attr -> [Char] -> IO ()
string x0 y fg bg cs =
  zipWithM_
    (\x c -> Tb.set x y (Tb.Cell c fg bg))
    [x0..]
    cs

rectangle :: Int -> Int -> Int -> Int -> Tb.Cell -> IO ()
rectangle x0 y0 x1 y1 c =
  for_ ((,) <$> [x0..x1] <*> [y0..y1]) $ \(x, y) ->
    Tb.set x y c