{-# LANGUAGE LambdaCase #-} {-# LANGUAGE ScopedTypeVariables #-} module Main where import Reactive.Banana import Reactive.Banana.Frameworks import qualified Termbox.Banana as Termbox main :: IO () main = Termbox.run_ (Termbox.InputModeEsc Termbox.MouseModeNo) Termbox.OutputModeNormal moment moment :: Event Termbox.Event -> Behavior (Int, Int) -> MomentIO (Behavior Termbox.Scene, Event ()) moment eEvent _bSize = do let eQuit :: Event () eQuit = () <$ filterE isKeyEsc eEvent bLatestEvent :: Behavior (Maybe Termbox.Event) <- stepper Nothing (Just <$> eEvent) let bCells :: Behavior Termbox.Cells bCells = maybe mempty renderEvent <$> bLatestEvent let bScene :: Behavior Termbox.Scene bScene = Termbox.Scene <$> bCells <*> pure Termbox.NoCursor pure (bScene, eQuit) renderEvent :: Termbox.Event -> Termbox.Cells renderEvent = foldMap (\(i, c) -> Termbox.set i 0 (Termbox.Cell c mempty mempty)) . zip [0..] . show isKeyEsc :: Termbox.Event -> Bool isKeyEsc = \case Termbox.EventKey Termbox.KeyEsc _ -> True _ -> False