module CabalGild.Unstable.Extra.ByteString where

import qualified Data.ByteString as ByteString

-- | Calling @replace needle replacement haystack@ will replace every
-- non-overlapping occurrence of @needle@ in @haystack@ with @replacement@.
--
-- <https://github.com/haskell/bytestring/issues/307>
replace ::
  ByteString.ByteString ->
  ByteString.ByteString ->
  ByteString.ByteString ->
  ByteString.ByteString
replace :: ByteString -> ByteString -> ByteString -> ByteString
replace ByteString
needle ByteString
replacement = ByteString -> [ByteString] -> ByteString
ByteString.intercalate ByteString
replacement ([ByteString] -> ByteString)
-> (ByteString -> [ByteString]) -> ByteString -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString -> [ByteString]
splitOn ByteString
needle

-- | Calling @splitOn needle haystack@ will split @haystack@ into a list of
-- substrings using @needle@ as the delimiter.
--
-- <https://github.com/haskell/bytestring/issues/100>
splitOn ::
  ByteString.ByteString ->
  ByteString.ByteString ->
  [ByteString.ByteString]
splitOn :: ByteString -> ByteString -> [ByteString]
splitOn ByteString
needle =
  let split :: ByteString -> (ByteString, ByteString)
split = ByteString -> ByteString -> (ByteString, ByteString)
ByteString.breakSubstring ByteString
needle
      go :: ByteString -> [ByteString]
go ByteString
haystack =
        let (ByteString
before, ByteString
after) = ByteString -> (ByteString, ByteString)
split ByteString
haystack
         in ByteString
before
              ByteString -> [ByteString] -> [ByteString]
forall a. a -> [a] -> [a]
: if ByteString -> Bool
ByteString.null ByteString
after
                then []
                else ByteString -> [ByteString]
go (Int -> ByteString -> ByteString
ByteString.drop (ByteString -> Int
ByteString.length ByteString
needle) ByteString
after)
   in ByteString -> [ByteString]
go