summaryrefslogtreecommitdiffstats
path: root/src/TextViewport/Render/RenderBuffer.hs
blob: fb782f522a216ec2e8eb2927293e1a00636b972f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
module TextViewport.Render.RenderBuffer where

import Data.Hashable (Hashable)
import Data.Sequence qualified as Seq
import Data.Sequences (Index, Textual)
import TextViewport.Buffer.Buffer (Buffer(..))
import TextViewport.Render.CachedRender
import TextViewport.Render.RenderCache
import TextViewport.Render.RenderItem (renderItem)
import TextViewport.Render.RenderedBuffer

renderBuffer :: (Hashable t, Textual t, Index t ~ Int) => Int -> Buffer t -> RenderCache t -> (RenderCache t, RenderedBuffer t)
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 :: (Hashable t, Textual t, Index t ~ Int) => Int -> Int -> Buffer t -> RenderCache t -> RenderedBuffer t -> (RenderCache t, RenderedBuffer t)
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)