Haskell -- brickを使ってみる 3

今回の目標はーー
ログ表示部分と エディタ部分を 1つづ つくり タイマーで 1秒ごとにログを表示していくもの
をつくること

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
module Main(main) where

import Lens.Micro ((^.))
import Lens.Micro.TH (makeLenses)
import Lens.Micro.Mtl ((%=),zoom)
import Control.Monad (void, forever)
import Control.Concurrent (threadDelay, forkIO)
import qualified Graphics.Vty as V

import Brick.BChan (newBChan, writeBChan)
import Brick.Main (App(..), showFirstCursor, customMain, halt)
import Brick.AttrMap (attrMap)
import Brick.Types (Widget, EventM, BrickEvent(..))
import Brick.Widgets.Core (str, (<+>), (<=>), hLimit, vLimit)
import Brick.Widgets.Edit as E
import Brick.Widgets.Center as C

data Name = Edit
          deriving (Ord, Show, Eq)

data CustomEvent = Counter deriving Show

data St = St { _stCounter :: Int
             , _edit :: E.Editor String Name
             }

makeLenses ''St

drawUI :: St -> [Brick.Types.Widget Name]
drawUI st = [ui]
    where a = (str $ "Counter value is: " <> (show $ st^.stCounter))
          e1 = E.renderEditor (str.unlines) True (st^.edit)
          ui = C.center $
            (str "Input : " <+> (hLimit 50 $ vLimit 5 e1)) <=>
            str " " <=>
            a <=>
            str " " <=>
            str "Esc to quit."


appEvent :: BrickEvent Name CustomEvent -> EventM Name St ()
appEvent e =
    case e of
        VtyEvent (V.EvKey V.KEsc []) -> halt
        AppEvent Counter -> do
          stCounter %= (+1)
        ev -> zoom edit $ E.handleEditorEvent ev 


initialState :: St
initialState = St { _stCounter = 0
                  , _edit = E.editor Edit Nothing ""
                  }

theApp :: App St CustomEvent Name 
theApp =
    App { appDraw = drawUI
        , appChooseCursor = showFirstCursor
        , appHandleEvent = appEvent
        , appStartEvent = return ()
        , appAttrMap = const $ attrMap V.defAttr []
        }

main :: IO ()
main = do
    chan <- newBChan 1

    void $ forkIO $ forever $ do
        writeBChan chan Counter
        threadDelay 100000

    let buildVty = V.mkVty V.defaultConfig
    initialVty <- buildVty
    void $ customMain initialVty buildVty (Just chan) theApp initialState

まだ目標は達成されてゐない
カウンターの値を 一行ごとに表示して スクロールさせていきたいんだよね
でも 我ながら 一應動くものをつくれて 満足してゐるよん〜
他のデモを見ていきながら 目標の實現を目指さうかな