{-# OPTIONS_HADDOCK hide #-}
-- |
-- Module      : Data.ByteString.Short.Char8
-- Copyright   : [2017..2020] The Accelerate Team
-- License     : BSD3
--
-- Maintainer  : Trevor L. McDonell <trevor.mcdonell@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--

module Data.ByteString.Short.Char8 (

  ShortByteString,
  pack,
  unpack,
  takeWhile,

) where

import Data.ByteString.Short                                        ( ShortByteString )
import Prelude                                                      as P hiding ( takeWhile )
import qualified Data.ByteString.Internal                           as BI
import qualified Data.ByteString.Short                              as BS
import qualified Data.ByteString.Short.Extra                        as BS


-- | /O(n)/ Convert a 'ShortByteString' into a list.
--
{-# INLINEABLE unpack #-}
unpack :: ShortByteString -> [Char]
unpack :: ShortByteString -> [Char]
unpack = (Word8 -> Char) -> [Word8] -> [Char]
forall a b. (a -> b) -> [a] -> [b]
P.map Word8 -> Char
BI.w2c ([Word8] -> [Char])
-> (ShortByteString -> [Word8]) -> ShortByteString -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShortByteString -> [Word8]
BS.unpack

-- | /O(n)/ Convert a 'String' into a 'ShortByteString'.
--
{-# INLINEABLE pack #-}
pack :: String -> ShortByteString
pack :: [Char] -> ShortByteString
pack = [Word8] -> ShortByteString
BS.pack ([Word8] -> ShortByteString)
-> ([Char] -> [Word8]) -> [Char] -> ShortByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Word8) -> [Char] -> [Word8]
forall a b. (a -> b) -> [a] -> [b]
P.map Char -> Word8
BI.c2w

-- | 'takeWhile', applied to a predicate @p@ and a ShortByteString @xs@, returns
-- the longest prefix (possibly empty) of @xs@ of elements that satisfy @p@.
--
{-# INLINEABLE takeWhile #-}
takeWhile :: (Char -> Bool) -> ShortByteString -> ShortByteString
takeWhile :: (Char -> Bool) -> ShortByteString -> ShortByteString
takeWhile Char -> Bool
f = (Word8 -> Bool) -> ShortByteString -> ShortByteString
BS.takeWhile (Char -> Bool
f (Char -> Bool) -> (Word8 -> Char) -> Word8 -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Char
BI.w2c)