summaryrefslogtreecommitdiffstats
path: root/src/TextViewport/Render/RenderCache.hs
blob: 29cd6fc08132a6082651c958faba71a8a6837c57 (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
module TextViewport.Render.RenderCache where

import Data.Sequence (Seq)
import Data.Sequence qualified as Seq
import TextViewport.Buffer.Buffer (Buffer(Buffer))
import TextViewport.Render.CachedRender (CachedRender)


newtype RenderCache a seg = RenderCache { unRenderCache :: Seq (Maybe (CachedRender a seg)) }
  deriving (Eq, Show)

-- | Create an empty cache matching the buffer size
emptyRenderCacheFor :: Buffer a seg -> RenderCache a seg
emptyRenderCacheFor (Buffer xs) =
    RenderCache (Seq.replicate (Seq.length xs) Nothing)

-- | Resize cache to match buffer length
resizeCache :: Buffer a seg -> RenderCache a seg -> RenderCache a seg
resizeCache (Buffer xs) (RenderCache cache) =
    let n = Seq.length xs
        m = Seq.length cache
    in RenderCache $
         if m < n then cache <> Seq.replicate (n - m) Nothing
         else Seq.take n cache

-- | Number of cached items
length :: RenderCache a seg -> Int
length (RenderCache xs) = Seq.length xs