text-builder-linear-0.1.2: Builder for Text and ByteString based on linear types
Copyright(c) 2022 Andrew Lelechenko
LicenseBSD3
MaintainerAndrew Lelechenko <andrew.lelechenko@gmail.com>
Safe HaskellSafe-Inferred
LanguageGHC2021

Data.Text.Builder.Linear

Description

Builder for strict Text and ByteString, based on linear types. It consistently outperforms Data.Text.Lazy.Builder from text as well as a strict builder from text-builder, and scales better.

Synopsis

Documentation

newtype Builder Source #

Thin wrapper over Buffer with a handy Semigroup instance.

>>> :set -XOverloadedStrings -XMagicHash
>>> fromText "foo" <> fromChar '_' <> fromAddr "bar"#
"foo_bar"

Remember: this is a strict builder, so on contrary to Data.Text.Lazy.Builder for optimal performance you should use strict left folds instead of lazy right ones.

Note that (similar to other builders) concatenation of Builders allocates thunks. This is to a certain extent mitigated by aggressive inlining, but it is faster to use Buffer directly.

Constructors

Builder 

Fields

Instances

Instances details
IsString Builder Source # 
Instance details

Defined in Data.Text.Builder.Linear

Methods

fromString :: String -> Builder #

Monoid Builder Source # 
Instance details

Defined in Data.Text.Builder.Linear

Semigroup Builder Source # 
Instance details

Defined in Data.Text.Builder.Linear

Show Builder Source # 
Instance details

Defined in Data.Text.Builder.Linear

runBuilder :: forall m. Builder %m -> Text Source #

Run Builder computation on an empty Buffer, returning strict Text.

>>> :set -XOverloadedStrings -XMagicHash
>>> runBuilder (fromText "foo" <> fromChar '_' <> fromAddr "bar"#)
"foo_bar"

This function has a polymorphic arrow and thus can be used both in usual and linear contexts.

runBuilderBS :: forall m. Builder %m -> ByteString Source #

Same as runBuilder, but returning a UTF-8 encoded strict ByteString.

fromText :: Text -> Builder Source #

Create Builder, containing a given Text.

>>> :set -XOverloadedStrings
>>> fromText "foo" <> fromText "bar"
"foobar"

fromChar :: Char -> Builder Source #

Create Builder, containing a given Char.

>>> fromChar 'x' <> fromChar 'y'
"xy"

In contrast to singleton, it's a responsibility of the caller to sanitize surrogate code points with safe.

fromAddr :: Addr# -> Builder Source #

Create Builder, containing a null-terminated UTF-8 string, specified by Addr#.

>>> :set -XMagicHash
>>> fromAddr "foo"# <> fromAddr "bar"#
"foobar"

The literal string must not contain zero bytes \0 and must be a valid UTF-8, these conditions are not checked.

fromDec :: (Integral a, FiniteBits a) => a -> Builder Source #

Create Builder, containing decimal representation of a given integer.

>>> fromChar 'x' <> fromDec (123 :: Int)
"x123"

fromHex :: (Integral a, FiniteBits a) => a -> Builder Source #

Create Builder, containing hexadecimal representation of a given integer.

>>> :set -XMagicHash
>>> fromAddr "0x"# <> fromHex (0x123def :: Int)
"0x123def"

fromDouble :: Double -> Builder Source #

Create Builder, containing decimal representation of a given Double.

>>> :set -XMagicHash
>>> fromAddr "pi="# <> fromDouble pi
"pi=3.141592653589793"