module Data.Monoid.Instances.ByteString.UTF8 (
ByteStringUTF8(..)
)
where
import Prelude hiding (foldl, foldl1, foldr, foldr1, scanl, scanr, scanl1, scanr1, map, concatMap, break, span)
import Data.String (IsString(fromString))
import Data.ByteString (ByteString)
import qualified Data.ByteString as ByteString
import qualified Data.ByteString.UTF8 as UTF8
import Data.Monoid (Monoid)
import Data.Monoid.Cancellative (LeftReductiveMonoid, LeftCancellativeMonoid, LeftGCDMonoid)
import Data.Monoid.Null (MonoidNull)
import Data.Monoid.Factorial (FactorialMonoid(..))
import Data.Monoid.Textual (TextualMonoid(..))
newtype ByteStringUTF8 = ByteStringUTF8 ByteString deriving (Eq, Show, Monoid, MonoidNull,
LeftReductiveMonoid, LeftCancellativeMonoid, LeftGCDMonoid)
instance IsString ByteStringUTF8 where
fromString = ByteStringUTF8 . UTF8.fromString
instance FactorialMonoid ByteStringUTF8 where
splitPrimePrefix (ByteStringUTF8 bs) =
do (_, n) <- UTF8.decode bs
let (bytes, rest) = ByteString.splitAt n bs
return (ByteStringUTF8 bytes, ByteStringUTF8 rest)
splitAt n (ByteStringUTF8 bs) = wrapPair (UTF8.splitAt n bs)
take n (ByteStringUTF8 bs) = ByteStringUTF8 (UTF8.take n bs)
drop n (ByteStringUTF8 bs) = ByteStringUTF8 (UTF8.drop n bs)
length (ByteStringUTF8 bs) = UTF8.length bs
instance TextualMonoid ByteStringUTF8 where
splitCharacterPrefix (ByteStringUTF8 bs) = do (c, rest) <- UTF8.uncons bs
if c == UTF8.replacement_char
then Nothing
else return (c, ByteStringUTF8 rest)
wrapPair (bs1, bs2) = (ByteStringUTF8 bs1, ByteStringUTF8 bs2)