netease-fm-1.2.2: exe/UI/Black.hs
module UI.Black (
black
) where
import qualified Brick.Main as UI
import qualified Brick.Widgets.Center as UI
import qualified Brick.Widgets.Core as UI
import qualified Brick.Types as UI
import qualified Graphics.Vty as UI
import qualified UI.Extra as UI
import Control.Concurrent.Chan (newChan, writeChan)
import Control.Monad.IO.Class (liftIO)
import Data.Default.Class
import Data.Maybe (fromMaybe)
data Event = Event UI.Event | Ohayou | Oyasumi
type State a b = (String, IO a, a -> IO b, Maybe b)
blackEvent :: State a b -> Event -> UI.EventM (UI.Next (State a b))
blackEvent (t, m, f, _) Ohayou = do
m' <- liftIO m
UI.suspendAndResume $ do
r <- f m'
return (t, m, f, Just r)
blackEvent state Oyasumi = UI.halt state
blackEvent state _ = UI.continue state
blackApp :: UI.App (State a b) Event
blackApp = UI.App { UI.appDraw = \(t, _, _, _) -> [UI.center (UI.str t)]
, UI.appStartEvent = return
, UI.appHandleEvent = blackEvent
, UI.appAttrMap = const UI.defaultAttributeMap
, UI.appLiftVtyEvent = Event
, UI.appChooseCursor = UI.neverShowCursor
}
black :: Maybe String -> IO a -> (a -> IO b) -> IO b
black t m f = do
chan <- newChan
writeChan chan Ohayou
writeChan chan Oyasumi
let title = fromMaybe [] t
(_, _, _, Just r) <- UI.customMain (UI.mkVty def) chan blackApp (title, m, f, Nothing)
return r