packages feed

bytestring-ft-0.1.0.0: src/Data/ByteString/FingerTree.hs

{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE BlockArguments, LambdaCase #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE ViewPatterns, BangPatterns #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Data.ByteString.FingerTree (

	-- * BYTE STRING

	ByteString,
	pattern Empty, pattern (:<), pattern (:>), pattern (:<|), pattern (:|>),

	-- * INTRODUCING AND ELIMINATING

	empty, singleton, pack, unpack, fromStrict, toStrict,

	-- * BASIC INTERFACE

	cons, snoc, append, uncons, unsnoc, null, length,

	-- * REDUCING BYTESTRINGS (FOLDS)

	foldl',

	-- * GENERATING

	replicate,

	-- * BREAKING

	splitAt', span

) where

import Prelude hiding (concat, null, length, replicate, span, foldl')
import Control.Arrow
import Data.Word
import Data.ByteString qualified as BS
import Data.ByteString.FingerTree.Internal

span :: (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)
span _ Empty = (Empty, Empty)
span p ba@(b :< bs)
	| p b = (b :<) `first` span p bs
	| otherwise = (Empty, ba)

foldl' :: (a -> Word8 -> a) -> a -> ByteString -> a
foldl' f !v = \case Empty -> v; bs :<| bss -> foldl' f (BS.foldl' f v bs) bss