From fdeb641fde5f82c3ad617c5c801ab40955fe62af Mon Sep 17 00:00:00 2001 From: tv Date: Thu, 19 Mar 2026 22:09:58 +0100 Subject: blessings: 2 -> 3 --- src/Much/Core.hs | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) (limited to 'src/Much/Core.hs') diff --git a/src/Much/Core.hs b/src/Much/Core.hs index 996d31b..b7f833a 100644 --- a/src/Much/Core.hs +++ b/src/Much/Core.hs @@ -3,8 +3,7 @@ module Much.Core where -import Blessings.Internal qualified as Blessings -import Blessings.String.WCWidth (Blessings(Plain,SGR),pp) +import Blessings (Blessings(SGR),pp) import Control.Concurrent import Control.Monad import Data.Aeson @@ -12,8 +11,14 @@ import Data.Functor import Data.Functor.Identity import Data.Map qualified as M import Data.Maybe +import Data.MonoTraversable (ointercalate) +import Data.Sequences qualified as S +import Data.String (fromString) +import Data.Text qualified as T +import Data.Text.IO qualified as T import Data.Time import Data.Tree.Zipper qualified as Z +import Data.WText (WText(unWText)) import Much.API import Much.Action import Much.Config qualified as Config @@ -23,7 +28,6 @@ import Much.Screen import Much.State import Much.TreeSearch import Much.TreeView -import Much.Utils import Notmuch qualified import Options.Applicative import Scanner (scan,Scan(..)) @@ -180,13 +184,13 @@ processEvent q = \case EResize w h -> return $ Right q { screenWidth = w, screenHeight = h - , flashMessage = Plain $ "resize " <> show (w,h) + , flashMessage = fromString $ "resize " <> show (w,h) } EStateGet f -> forkIO (f q) $> Right q ev -> return $ Right q - { flashMessage = SGR [31,1] $ Plain $ "unhandled event: " <> show ev + { flashMessage = SGR [31,1] $ fromString $ "unhandled event: " <> show ev } @@ -198,18 +202,18 @@ render q@State{..} = where newTreeBuf = renderTreeView q (Z.root cursor) newHeadBuf = - [ Plain (show screenWidth) <> "x" <> Plain (show screenHeight) - <> " " <> Plain (show $ linearPos cursor - yoffset) - <> " " <> Plain (show $ topOverrun q) - <> " " <> Plain (show $ botOverrun q) + [ fromString (show screenWidth) <> "x" <> fromString (show screenHeight) + <> " " <> fromString (show $ linearPos cursor - yoffset) + <> " " <> fromString (show $ topOverrun q) + <> " " <> fromString (show $ botOverrun q) <> " " <> flashMessage - <> " " <> Plain (show (xoffset, yoffset)) + <> " " <> fromString (show (xoffset, yoffset)) ] -render0 :: State -> [Blessings String] +render0 :: State -> [Blessings WText] render0 _q@State{..} = do let buffer = - map (Blessings.take screenWidth . Blessings.drop xoffset) $ + map (S.take screenWidth . S.drop xoffset) $ take screenHeight $ headBuffer ++ drop yoffset treeBuffer buffer ++ replicate (screenHeight - length buffer) "~" @@ -217,11 +221,11 @@ render0 _q@State{..} = do redraw :: State -> IO () redraw q@State{..} = do - hPutStr stdout $ map (sub '\t' ' ') $ "\ESC[H" ++ pp (mintercalate "\n" $ map eraseRight $ render0 q) + T.hPutStr stdout $ T.map (sub '\t' ' ') $ unWText $ "\ESC[H" <> pp (ointercalate "\n" $ map eraseRight $ render0 q) hFlush stdout where sub x x' c = if c == x then x' else c eraseRight s = - if Blessings.length s < screenWidth + if S.lengthIndex s < screenWidth then s <> "\ESC[K" else s -- cgit v1.2.3