-- | Wrap Data.Text
--
-- We plan to replace it with Haskus.Text in the future
module Haskus.Utils.Text
( module Data.Text
-- * Conversions
, bufferDecodeUtf8
, textEncodeUtf8
, stringEncodeUtf8
-- * Formatting
, textFormat
, F.Format
, (F.%)
, (F.%.)
, module Formatting.Formatters
-- * Parsing
, textParseHexadecimal
-- * Get/Put
, putTextUtf8
, getTextUtf8
, getTextUtf8Nul
, tshow
-- * IO
, T.putStrLn
)
where
import Data.Text hiding (center)
import qualified Data.Text.Encoding as T
import qualified Data.Text as T
import qualified Data.Text.IO as T
import Formatting as F
import Formatting.Formatters
import Data.Text.Read as T
import Haskus.Binary.Buffer
import Haskus.Binary.Put
import Haskus.Binary.Get
-- | Decode Utf8
bufferDecodeUtf8 :: Buffer -> Text
bufferDecodeUtf8 (Buffer bs) = T.decodeUtf8 bs
-- | Encode Text into Utf8
textEncodeUtf8 :: Text -> Buffer
textEncodeUtf8 = Buffer . T.encodeUtf8
-- | Encode String into Utf8
stringEncodeUtf8 :: String -> Buffer
stringEncodeUtf8 = textEncodeUtf8 . T.pack
-- | Format a text (strict)
textFormat :: Format Text a -> a
textFormat = F.sformat
-- | Parse an hexadecimal number
-- FIXME: use a real parser (MegaParsec, etc.)
textParseHexadecimal :: Integral a => Text -> Either String a
textParseHexadecimal s = fst <$> T.hexadecimal s
-- | Put an UTF8 encoded text
putTextUtf8 :: Text -> Put
putTextUtf8 = putBuffer . textEncodeUtf8
-- | Pull n bytes from the input, as a Buffer
getTextUtf8 :: Word -> Get Text
getTextUtf8 sz = bufferDecodeUtf8 <$> getBuffer sz
-- | Pull \0 terminal text
getTextUtf8Nul :: Get Text
getTextUtf8Nul = bufferDecodeUtf8 <$> getBufferNul
-- | Show as Text
tshow :: Show a => a -> Text
tshow = pack . show