packages feed

picoparsec-0.1: benchmarks/Data/Monoid/Instances/ByteString/Char8.hs

{- 
    Copyright 2014 Mario Blazevic

    License: BSD3 (see BSD3-LICENSE.txt file)
-}

-- | This module defines the 'ByteStringUTF8' newtype wrapper around 'ByteString', together with its 'TextualMonoid'
-- instance.
-- 

{-# LANGUAGE BangPatterns #-}

module Data.Monoid.Instances.ByteString.Char8 () where

import Data.ByteString.Char8 (ByteString)
import qualified Data.ByteString.Char8 as ByteString.Char8
import qualified Data.ByteString as B
import qualified Data.ByteString.Internal as B
import qualified Data.ByteString.Unsafe as B

import Data.Monoid.Textual (TextualMonoid(..))

instance TextualMonoid ByteString where
   singleton = ByteString.Char8.singleton
   splitCharacterPrefix bs = ByteString.Char8.uncons bs
   foldl _ft fc a0 bs = ByteString.Char8.foldl fc a0 bs
   foldl' _ft fc a0 bs = ByteString.Char8.foldl' fc a0 bs
   {-# INLINE foldl' #-}
   foldr _ft fc a0 bs = ByteString.Char8.foldr fc a0 bs
   {-# INLINE foldr #-}
   dropWhile _pt pc bs = ByteString.Char8.dropWhile pc bs
   {-# INLINE dropWhile #-}
   takeWhile _pt pc bs = ByteString.Char8.takeWhile pc bs
   {-# INLINE takeWhile #-}
   span _pt pc bs = ByteString.Char8.span pc bs
   {-# INLINE span #-}
   break _pt pc bs = ByteString.Char8.break pc bs
   {-# INLINE break #-}
   spanMaybe s0 _fb fc bs =
      let inner !i !s
            | i < len =
                case fc s (B.w2c $ B.unsafeIndex bs i)
                of Just s' -> inner (i + 1) s'
                   _       -> done i s
            | otherwise = done i s
          done !i !s = (B.unsafeTake i bs, B.unsafeDrop i bs, s)
          !len = B.length bs
      in inner 0 s0
   {-# INLINE spanMaybe #-}