summaryrefslogtreecommitdiffstats
path: root/src/TextViewport/Render/RenderBuffer.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/TextViewport/Render/RenderBuffer.hs')
-rw-r--r--src/TextViewport/Render/RenderBuffer.hs31
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)