aboutsummaryrefslogtreecommitdiff
path: root/Data/ByteStringBuilder.hs
blob: 98b3db5bfa9b13240a547012a91dada8d39b8d1b (plain) (blame)
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
36
37
38
39
40
41
42
43
module Data.ByteStringBuilder where

import Data.ByteString.Lazy as BSL
import Data.ByteString.Lazy.Char8 as BSLC
import Data.Word

data ByteStringBuilder a = ByteStringBuilder ByteString a

type Builder = ByteStringBuilder ()

put :: ByteString -> Builder
put = flip ByteStringBuilder ()

putS :: String -> Builder
putS = put . BSLC.pack

putSLn :: String -> Builder
putSLn str = putS str >> putC '\n'

putC :: Char -> Builder
putC = put . BSLC.singleton

putB :: Word8 -> Builder
putB = put . BSL.singleton

runBuilder :: Builder -> ByteString
runBuilder (ByteStringBuilder bs _) = bs

instance Functor ByteStringBuilder where
  fmap f bb = bb >>= (return . f)

instance Applicative ByteStringBuilder where
  (<*>) afn aa = do
    fn <- afn
    a <- aa
    return (fn a)

  pure = return

instance Monad ByteStringBuilder where
  ByteStringBuilder a _ >> ByteStringBuilder b c = ByteStringBuilder (a `append` b) c
  a@(ByteStringBuilder _ b) >>= func = a >> func b
  return = ByteStringBuilder BSL.empty