diff options
| author | tv <tv@krebsco.de> | 2026-03-09 03:35:50 +0100 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-03-09 03:35:50 +0100 |
| commit | a648d77052f04d4731d728fc317a0947b35a3ed5 (patch) | |
| tree | 2e125e5f3a0a5d29884dcb35e729523153e00a5c /src/TextViewport/Render/RenderState.hs | |
| parent | bff24914f21800719c99c80165a8c3a3759311e7 (diff) | |
Diffstat (limited to 'src/TextViewport/Render/RenderState.hs')
| -rw-r--r-- | src/TextViewport/Render/RenderState.hs | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/src/TextViewport/Render/RenderState.hs b/src/TextViewport/Render/RenderState.hs index 8c0cdef..978ec31 100644 --- a/src/TextViewport/Render/RenderState.hs +++ b/src/TextViewport/Render/RenderState.hs @@ -11,16 +11,18 @@ 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 +import TextViewport.Render.Segmentation (Segmenter) -data RenderState a = RenderState - { rsBuffer :: Buffer a -- original items - , rsCache :: RenderCache a -- per-item cached renders + +data RenderState a seg = RenderState + { rsBuffer :: Buffer a seg -- original items + , rsCache :: RenderCache a seg -- per-item cached renders , rsRendered :: RenderedBuffer a -- fully segmented + hyphenated lines , rsWidth :: Int -- segmenting width , rsLineCount :: Int } deriving (Eq, Show) -mkRenderState :: (Hashable a, Textual a, Index a ~ Int) => Int -> Buffer a -> RenderState a +mkRenderState :: (Segmenter seg a, Hashable a, Textual a, Index a ~ Int) => Int -> Buffer a seg -> RenderState a seg mkRenderState width buf = let (cache1, rendered) = renderBuffer width buf (emptyRenderCacheFor buf) in RenderState @@ -32,7 +34,7 @@ mkRenderState width buf = } -- RenderState has to be rebuilt whenever the buffer or the width changes. -updateRenderState :: (Hashable a, Textual a, Index a ~ Int) => Int -> Buffer a -> RenderState a -> RenderState a +updateRenderState :: (Segmenter seg a, Hashable a, Textual a, Index a ~ Int) => Int -> Buffer a seg -> RenderState a seg -> RenderState a seg updateRenderState width buf rs = let (cache1, rendered) = renderBuffer width buf (rsCache rs) in rs @@ -43,7 +45,7 @@ updateRenderState width buf rs = , rsLineCount = length (RenderedBuffer.flatten rendered) } -modifyItemRS :: (Hashable a, Textual a, Index a ~ Int) => Int -> (Item a -> Item a) -> RenderState a -> RenderState a +modifyItemRS :: (Segmenter seg a, Hashable a, Textual a, Index a ~ Int) => Int -> (Item a seg -> Item a seg) -> RenderState a seg -> RenderState a seg modifyItemRS ix f st = let buf' = Buffer.modifyItem ix f (rsBuffer st) cache' = resizeCache buf' (rsCache st) @@ -54,7 +56,7 @@ modifyItemRS ix f st = , rsLineCount = length (RenderedBuffer.flatten rendered1) } -insertItem :: (Hashable a, Textual a, Index a ~ Int) => Int -> Item a -> RenderState a -> RenderState a +insertItem :: (Segmenter seg a, Hashable a, Textual a, Index a ~ Int) => Int -> Item a seg -> RenderState a seg -> RenderState a seg insertItem i newItem st = let Buffer items = rsBuffer st items' = Seq.insertAt i newItem items @@ -67,7 +69,7 @@ insertItem i newItem st = , rsLineCount = length (RenderedBuffer.flatten rendered1) } -deleteItem :: (Hashable a, Textual a, Index a ~ Int) => Int -> RenderState a -> RenderState a +deleteItem :: (Segmenter seg a, Hashable a, Textual a, Index a ~ Int) => Int -> RenderState a seg -> RenderState a seg deleteItem i st = let Buffer items = rsBuffer st items' = Seq.deleteAt i items @@ -80,7 +82,7 @@ deleteItem i st = , rsLineCount = length (RenderedBuffer.flatten rendered1) } -replaceItem :: (Hashable a, Textual a, Index a ~ Int) => Int -> Item a -> RenderState a -> RenderState a +replaceItem :: (Segmenter seg a, Hashable a, Textual a, Index a ~ Int) => Int -> Item a seg -> RenderState a seg -> RenderState a seg replaceItem i newItem st = let Buffer items = rsBuffer st items' = Seq.update i newItem items @@ -93,11 +95,11 @@ replaceItem i newItem st = , rsLineCount = length (RenderedBuffer.flatten rendered1) } -appendItem :: (Hashable a, Textual a, Index a ~ Int) => Item a -> RenderState a -> RenderState a +appendItem :: (Segmenter seg a, Hashable a, Textual a, Index a ~ Int) => Item a seg -> RenderState a seg -> RenderState a seg appendItem newItem st = insertItem (Seq.length (let Buffer xs = rsBuffer st in xs)) newItem st -clearBuffer :: RenderState a -> RenderState a +clearBuffer :: RenderState a seg -> RenderState a seg clearBuffer st = let buf' = Buffer Seq.empty cache' = RenderCache Seq.empty @@ -107,7 +109,7 @@ clearBuffer st = , rsLineCount = 0 } -fromList :: (Hashable a, Textual a, Index a ~ Int) => Int -> [Item a] -> RenderState a +fromList :: (Segmenter seg a, Hashable a, Textual a, Index a ~ Int) => Int -> [Item a seg] -> RenderState a seg fromList width xs = let buf = Buffer (Seq.fromList xs) cache0 = RenderCache (Seq.replicate (length xs) Nothing) @@ -120,7 +122,7 @@ fromList width xs = , rsLineCount = length (RenderedBuffer.flatten rendered) } -fromSeq :: (Hashable a, Textual a, Index a ~ Int) => Int -> Seq (Item a) -> RenderState a +fromSeq :: (Segmenter seg a, Hashable a, Textual a, Index a ~ Int) => Int -> Seq (Item a seg) -> RenderState a seg fromSeq width items = let buf = Buffer items cache0 = RenderCache (Seq.replicate (Seq.length items) Nothing) |
