text- An efficient packed Unicode text type.

Copyright(c) 2008 2009 Tom Harper
(c) 2009 2010 Bryan O'Sullivan
(c) 2009 Duncan Coutts
Safe HaskellNone




A module containing private Text internals. This exposes the Text representation and low level construction functions. Modules which extend the Text system may need to use this module.

You should not use this module unless you are determined to monkey with the internals, as the functions here do just about nothing to preserve data invariants. You have been warned!



Internally, the Text type is represented as an array of Word16 UTF-16 code units. The offset and length fields in the constructor are in these units, not units of Char.

Invariants that all functions must maintain:

  • Since the Text type uses UTF-16 internally, it cannot represent characters in the reserved surrogate code point range U+D800 to U+DFFF. To maintain this invariant, the safe function maps Char values in this range to the replacement character (U+FFFD, '�').
  • A leading (or "high") surrogate code unit (0xD800–0xDBFF) must always be followed by a trailing (or "low") surrogate code unit (0xDC00-0xDFFF). A trailing surrogate code unit must always be preceded by a leading surrogate code unit.

data Text Source #

A space efficient, packed, unboxed Unicode text type.


Text !Array !Int !Int 
IsList Text #


Instance details

Associated Types

type Item Text :: * Source #

Eq Text # 
Instance details


(==) :: Text -> Text -> Bool Source #

(/=) :: Text -> Text -> Bool Source #

Data Text #

This instance preserves data abstraction at the cost of inefficiency. We omit reflection services for the sake of data abstraction.

This instance was created by copying the updated behavior of Data.Set.Set and Data.Map.Map. If you feel a mistake has been made, please feel free to submit improvements.

The original discussion is archived here: could we get a Data instance for Data.Text.Text?

The followup discussion that changed the behavior of Set and Map is archived here: Proposal: Allow gunfold for Data.Map, ...

Instance details


gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Text -> c Text Source #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Text Source #

toConstr :: Text -> Constr Source #

dataTypeOf :: Text -> DataType Source #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c Text) Source #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Text) Source #

gmapT :: (forall b. Data b => b -> b) -> Text -> Text Source #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Text -> r Source #

gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Text -> r Source #

gmapQ :: (forall d. Data d => d -> u) -> Text -> [u] Source #

gmapQi :: Int -> (forall d. Data d => d -> u) -> Text -> u Source #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> Text -> m Text Source #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Text -> m Text Source #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Text -> m Text Source #

Ord Text # 
Instance details
Read Text # 
Instance details
Show Text # 
Instance details
IsString Text # 
Instance details
Semigroup Text #

Non-orphan Semigroup instance only defined for base- and later; orphan instances for older GHCs are provided by the semigroups package


Instance details
Monoid Text # 
Instance details
PrintfArg Text #

Only defined for base- and later


Instance details
Binary Text #


Instance details
NFData Text # 
Instance details


rnf :: Text -> () Source #

type Item Text # 
Instance details
type Item Text = Char


text :: Array -> Int -> Int -> Text Source #

Construct a Text without invisibly pinning its byte array in memory if its length has dwindled to zero.

textP :: Array -> Int -> Int -> Text Source #

Deprecated: Use text instead


safe :: Char -> Char Source #

Map a Char to a Text-safe value.

UTF-16 surrogate code points are not included in the set of Unicode scalar values, but are unfortunately admitted as valid Char values by Haskell. They cannot be represented in a Text. This function remaps those code points to the Unicode replacement character (U+FFFD, '�'), and leaves other code points unchanged.

Code that must be here for accessibility

empty :: Text Source #

O(1) The empty Text.

empty_ :: Text Source #

A non-inlined version of empty.


firstf :: (a -> c) -> Maybe (a, b) -> Maybe (c, b) Source #

Apply a function to the first element of an optional pair.

Checked multiplication

mul :: Int -> Int -> Int infixl 7 Source #

Checked multiplication. Calls error if the result would overflow.

mul32 :: Int32 -> Int32 -> Int32 infixl 7 Source #

Checked multiplication. Calls error if the result would overflow.

mul64 :: Int64 -> Int64 -> Int64 infixl 7 Source #

Checked multiplication. Calls error if the result would overflow.


showText :: Text -> String Source #

A useful show-like function for debugging purposes.