diff options
Diffstat (limited to 'src/TextViewport/Render/RenderBuffer.hs')
| -rw-r--r-- | src/TextViewport/Render/RenderBuffer.hs | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/TextViewport/Render/RenderBuffer.hs b/src/TextViewport/Render/RenderBuffer.hs new file mode 100644 index 0000000..a1122a4 --- /dev/null +++ b/src/TextViewport/Render/RenderBuffer.hs @@ -0,0 +1,31 @@ +module TextViewport.Render.RenderBuffer where + +import Data.Sequence qualified as Seq +import TextViewport.Buffer.Buffer (Buffer(..)) +import TextViewport.Render.CachedRender +import TextViewport.Render.RenderCache +import TextViewport.Render.RenderItem (renderItem) +import TextViewport.Render.RenderedBuffer + +renderBuffer :: Int -> Buffer -> RenderCache -> (RenderCache, RenderedBuffer) +renderBuffer width (Buffer items) (RenderCache cache) = + let n = Seq.length items + go i (cAcc, rAcc) + | i >= n = (RenderCache cAcc, RenderedBuffer rAcc) + | otherwise = + let item = Seq.index items i + mOld = Seq.index cache i + newEntry = renderItem width i item mOld + cAcc' = Seq.update i (Just newEntry) cAcc + rAcc' = rAcc Seq.|> crRendered newEntry + in go (i + 1) (cAcc', rAcc') + in go 0 (cache, Seq.empty) + +updateRenderedItem :: Int -> Int -> Buffer -> RenderCache -> RenderedBuffer -> (RenderCache, RenderedBuffer) +updateRenderedItem width itemIx (Buffer items) (RenderCache cache) (RenderedBuffer rb) = + let item = Seq.index items itemIx + mOld = Seq.index cache itemIx + newEntry = renderItem width itemIx item mOld + newCache = Seq.update itemIx (Just newEntry) cache + newRB = Seq.update itemIx (crRendered newEntry) rb + in (RenderCache newCache, RenderedBuffer newRB) |
