darcs-2.8.0: src/Darcs/Patch/TokenReplace.hs
module Darcs.Patch.TokenReplace
(
tryTokInternal
, forceTokReplace
)
where
import Darcs.Patch.RegChars ( regChars )
import ByteStringUtils ( substrPS, linesPS, unlinesPS )
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as BC
import Data.Maybe ( isNothing )
tryTokInternal :: String -> B.ByteString -> B.ByteString
-> B.ByteString -> Maybe [B.ByteString]
tryTokInternal _ o n s | isNothing (substrPS o s) &&
isNothing (substrPS n s) = Just [s]
tryTokInternal t o n s =
case BC.break (regChars t) s of
(before,s') ->
case BC.break (not . regChars t) s' of
(tok,after) ->
case tryTokInternal t o n after of
Nothing -> Nothing
Just rest ->
if tok == o
then Just $ before : n : rest
else if tok == n
then Nothing
else Just $ before : tok : rest
forceTokReplace :: String -> String -> String
-> B.ByteString -> Maybe B.ByteString
forceTokReplace t os ns c = Just $ unlinesPS $ map forceReplace $ linesPS c
where o = BC.pack os
n = BC.pack ns
tokchar = regChars t
toks_and_intratoks ps | B.null ps = []
toks_and_intratoks ps =
let (before,s') = BC.break tokchar ps
(tok, after) = BC.break (not . tokchar) s'
in before : tok : toks_and_intratoks after
forceReplace ps = B.concat $ map o_t_n $ toks_and_intratoks ps
o_t_n s | s == o = n
| otherwise = s