63 lines
1.7 KiB
Haskell
63 lines
1.7 KiB
Haskell
{-# LANGUAGE BangPatterns #-}
|
|
{-# LANGUAGE DeriveDataTypeable #-}
|
|
{-# LANGUAGE TypeFamilies #-}
|
|
{-# LANGUAGE RebindableSyntax #-}
|
|
{-# LANGUAGE NoImplicitPrelude #-}
|
|
-- |
|
|
-- Module : Basement.String.Builder
|
|
-- License : BSD-style
|
|
-- Maintainer : Foundation
|
|
--
|
|
-- String builder
|
|
|
|
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
|
|
|
module Basement.String.Builder
|
|
( Builder
|
|
, run
|
|
, runUnsafe
|
|
|
|
-- * Emit functions
|
|
, emit
|
|
, emitChar
|
|
|
|
-- * unsafe
|
|
, unsafeStringBuilder
|
|
) where
|
|
|
|
|
|
import qualified Basement.Block.Base as Block (length)
|
|
import qualified Basement.Block.Builder as Block
|
|
import Basement.Compat.Base
|
|
import Basement.Compat.Semigroup
|
|
import Basement.Monad
|
|
import Basement.String (String, ValidationFailure, Encoding (UTF8), fromBytes)
|
|
import Basement.UArray.Base (UArray)
|
|
import qualified Basement.UArray.Base as A
|
|
|
|
newtype Builder = Builder Block.Builder
|
|
deriving (Semigroup, Monoid)
|
|
|
|
unsafeStringBuilder :: Block.Builder -> Builder
|
|
unsafeStringBuilder = Builder
|
|
{-# INLINE unsafeStringBuilder #-}
|
|
|
|
run :: PrimMonad prim => Builder -> prim (String, Maybe ValidationFailure, UArray Word8)
|
|
run (Builder builder) = do
|
|
block <- Block.run builder
|
|
let array = A.UArray 0 (Block.length block) (A.UArrayBA block)
|
|
pure $ fromBytes UTF8 array
|
|
|
|
-- | run the given builder and return the generated String
|
|
--
|
|
-- prefer `run`
|
|
runUnsafe :: PrimMonad prim => Builder -> prim String
|
|
runUnsafe (Builder builder) = Block.unsafeRunString builder
|
|
|
|
-- | add a string in the builder
|
|
emit :: String -> Builder
|
|
emit = Builder . Block.emitString
|
|
|
|
-- | emit a UTF8 char in the builder
|
|
emitChar :: Char -> Builder
|
|
emitChar = Builder . Block.emitUTF8Char
|