summaryrefslogtreecommitdiffstats
path: root/src/TextViewport/Buffer/Buffer.hs
blob: 53eb10305c67c88c96c58bee7ef5b3a12ed4372f (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
34
35
module TextViewport.Buffer.Buffer where

import Data.Sequence qualified as Seq
import TextViewport.Buffer.Item (Item)

newtype Buffer a seg = Buffer { unBuffer :: Seq.Seq (Item a seg) }
  deriving (Eq, Show)

-- | Build a buffer from a list
fromList :: [Item a seg] -> Buffer a seg
fromList xs = Buffer (Seq.fromList xs)

-- | Modify an item at index
modifyItem :: Int -> (Item a seg -> Item a seg) -> Buffer a seg -> Buffer a seg
modifyItem ix f (Buffer xs) =
    Buffer (Seq.adjust' f ix xs)

-- | Insert an item
insertItem :: Int -> Item a seg -> Buffer a seg -> Buffer a seg
insertItem ix x (Buffer xs) =
    Buffer (Seq.insertAt ix x xs)

-- | Delete an item
deleteItem :: Int -> Buffer a seg -> Buffer a seg
deleteItem ix (Buffer xs) =
    Buffer (Seq.deleteAt ix xs)

-- | Append an item
appendItem :: Item a seg -> Buffer a seg -> Buffer a seg
appendItem x (Buffer xs) =
    Buffer (xs Seq.|> x)

-- | Extract underlying Seq (if needed)
toSeq :: Buffer a seg -> Seq.Seq (Item a seg)
toSeq (Buffer xs) = xs