    ------------------------------------------------------------------------------
    -- |
    -- Module:      Blaze.ByteString.Builder.Char.Utf8
    -- Copyright:   (c) 2013 Leon P Smith
    -- License:     BSD3
    -- Maintainer:  Leon P Smith <leon@melding-monads.com>
    -- Stability:   experimental
    --
    -- 'Write's and 'Builder's for serializing Unicode characters using the UTF-8
    -- encoding.
    --
    ------------------------------------------------------------------------------

    module Blaze.ByteString.Builder.Char.Utf8
        (
          -- * Writing UTF-8 encoded characters to a buffer
          writeChar

          -- * Creating Builders from UTF-8 encoded characters
        , fromChar
        , fromString
        , fromShow
        , fromText
        , fromLazyText
        ) where

    import Blaze.ByteString.Builder.Compat.Write (Write, writePrimBounded)
    import           Data.ByteString.Builder ( Builder )
    import qualified Data.ByteString.Builder as B
    import qualified Data.ByteString.Builder.Prim as P
    import qualified Data.Text      as TS
    import qualified Data.Text.Lazy as TL

    -- | Write a UTF-8 encoded Unicode character to a buffer.
    --
    writeChar :: Char -> Write
    writeChar = writePrimBounded P.charUtf8
    {-# INLINE writeChar #-}

    -- | /O(1)/. Serialize a Unicode character using the UTF-8 encoding.
    --
    fromChar :: Char -> Builder
    fromChar = B.charUtf8
    {-# INLINE fromChar #-}

    -- | /O(n)/. Serialize a Unicode 'String' using the UTF-8 encoding.
    --
    fromString :: String -> Builder
    fromString = B.stringUtf8
    {-# INLINE fromString #-}

    -- | /O(n)/. Serialize a value by 'Show'ing it and UTF-8 encoding the resulting
    -- 'String'.
    --
    fromShow :: Show a => a -> Builder
    fromShow = fromString . show
    {-# INLINE fromShow #-}

    -- | /O(n)/. Serialize a strict Unicode 'TS.Text' value using the UTF-8 encoding.
    --
    fromText :: TS.Text -> Builder
    fromText = fromString . TS.unpack
    {-# INLINE fromText #-}

    -- | /O(n)/. Serialize a lazy Unicode 'TL.Text' value using the UTF-8 encoding.
    --
    fromLazyText :: TL.Text -> Builder
    fromLazyText = fromString . TL.unpack
    {-# INLINE fromLazyText #-}