From 230e538e41360f2018db9a8b5274402d0b3200b6 Mon Sep 17 00:00:00 2001 From: tv Date: Mon, 9 Mar 2026 02:25:18 +0100 Subject: generalize Item from Text to Textual --- src/TextViewport/Render/RenderState.hs | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) (limited to 'src/TextViewport/Render/RenderState.hs') diff --git a/src/TextViewport/Render/RenderState.hs b/src/TextViewport/Render/RenderState.hs index 26e92e1..8c0cdef 100644 --- a/src/TextViewport/Render/RenderState.hs +++ b/src/TextViewport/Render/RenderState.hs @@ -1,24 +1,26 @@ module TextViewport.Render.RenderState where +import Data.Hashable (Hashable) import Data.Sequence (Seq) import Data.Sequence qualified as Seq -import TextViewport.Buffer.Item +import Data.Sequences (Index, Textual) import TextViewport.Buffer.Buffer (Buffer(Buffer)) import TextViewport.Buffer.Buffer qualified as Buffer +import TextViewport.Buffer.Item import TextViewport.Render.RenderBuffer (renderBuffer) import TextViewport.Render.RenderCache (RenderCache(..), emptyRenderCacheFor, resizeCache) import TextViewport.Render.RenderedBuffer (RenderedBuffer(RenderedBuffer)) import TextViewport.Render.RenderedBuffer qualified as RenderedBuffer -data RenderState = RenderState - { rsBuffer :: Buffer -- original items - , rsCache :: RenderCache -- per-item cached renders - , rsRendered :: RenderedBuffer -- fully segmented + hyphenated lines +data RenderState a = RenderState + { rsBuffer :: Buffer a -- original items + , rsCache :: RenderCache a -- per-item cached renders + , rsRendered :: RenderedBuffer a -- fully segmented + hyphenated lines , rsWidth :: Int -- segmenting width , rsLineCount :: Int } deriving (Eq, Show) -mkRenderState :: Int -> Buffer -> RenderState +mkRenderState :: (Hashable a, Textual a, Index a ~ Int) => Int -> Buffer a -> RenderState a mkRenderState width buf = let (cache1, rendered) = renderBuffer width buf (emptyRenderCacheFor buf) in RenderState @@ -30,7 +32,7 @@ mkRenderState width buf = } -- RenderState has to be rebuilt whenever the buffer or the width changes. -updateRenderState :: Int -> Buffer -> RenderState -> RenderState +updateRenderState :: (Hashable a, Textual a, Index a ~ Int) => Int -> Buffer a -> RenderState a -> RenderState a updateRenderState width buf rs = let (cache1, rendered) = renderBuffer width buf (rsCache rs) in rs @@ -41,7 +43,7 @@ updateRenderState width buf rs = , rsLineCount = length (RenderedBuffer.flatten rendered) } -modifyItemRS :: Int -> (Item -> Item) -> RenderState -> RenderState +modifyItemRS :: (Hashable a, Textual a, Index a ~ Int) => Int -> (Item a -> Item a) -> RenderState a -> RenderState a modifyItemRS ix f st = let buf' = Buffer.modifyItem ix f (rsBuffer st) cache' = resizeCache buf' (rsCache st) @@ -52,7 +54,7 @@ modifyItemRS ix f st = , rsLineCount = length (RenderedBuffer.flatten rendered1) } -insertItem :: Int -> Item -> RenderState -> RenderState +insertItem :: (Hashable a, Textual a, Index a ~ Int) => Int -> Item a -> RenderState a -> RenderState a insertItem i newItem st = let Buffer items = rsBuffer st items' = Seq.insertAt i newItem items @@ -65,7 +67,7 @@ insertItem i newItem st = , rsLineCount = length (RenderedBuffer.flatten rendered1) } -deleteItem :: Int -> RenderState -> RenderState +deleteItem :: (Hashable a, Textual a, Index a ~ Int) => Int -> RenderState a -> RenderState a deleteItem i st = let Buffer items = rsBuffer st items' = Seq.deleteAt i items @@ -78,7 +80,7 @@ deleteItem i st = , rsLineCount = length (RenderedBuffer.flatten rendered1) } -replaceItem :: Int -> Item -> RenderState -> RenderState +replaceItem :: (Hashable a, Textual a, Index a ~ Int) => Int -> Item a -> RenderState a -> RenderState a replaceItem i newItem st = let Buffer items = rsBuffer st items' = Seq.update i newItem items @@ -91,11 +93,11 @@ replaceItem i newItem st = , rsLineCount = length (RenderedBuffer.flatten rendered1) } -appendItem :: Item -> RenderState -> RenderState +appendItem :: (Hashable a, Textual a, Index a ~ Int) => Item a -> RenderState a -> RenderState a appendItem newItem st = insertItem (Seq.length (let Buffer xs = rsBuffer st in xs)) newItem st -clearBuffer :: RenderState -> RenderState +clearBuffer :: RenderState a -> RenderState a clearBuffer st = let buf' = Buffer Seq.empty cache' = RenderCache Seq.empty @@ -105,7 +107,7 @@ clearBuffer st = , rsLineCount = 0 } -fromList :: Int -> [Item] -> RenderState +fromList :: (Hashable a, Textual a, Index a ~ Int) => Int -> [Item a] -> RenderState a fromList width xs = let buf = Buffer (Seq.fromList xs) cache0 = RenderCache (Seq.replicate (length xs) Nothing) @@ -118,7 +120,7 @@ fromList width xs = , rsLineCount = length (RenderedBuffer.flatten rendered) } -fromSeq :: Int -> Seq Item -> RenderState +fromSeq :: (Hashable a, Textual a, Index a ~ Int) => Int -> Seq (Item a) -> RenderState a fromSeq width items = let buf = Buffer items cache0 = RenderCache (Seq.replicate (Seq.length items) Nothing) -- cgit v1.2.3