module Text.Regex.Do.Type.Do_ where

import Text.Regex.Base.RegexLike as R


-- | see "Text.Regex.Do.Replace.Open" 'defaultReplacer' for example implementation
newtype GroupReplacer b = GroupReplacer (MatchArray -> ReplaceAcc b -> ReplaceAcc b) -- MatchArray -> acc -> acc

data ReplaceAcc b = ReplaceAcc {
    ReplaceAcc b -> b
acc::b,   -- ^ content with some replacements made
    ReplaceAcc b -> Int
pos_adj::Int    {- ^ position adjustment: group replacement length may differ from replaced text length -}
    }

instance Functor ReplaceAcc where
    fmap :: (a -> b) -> ReplaceAcc a -> ReplaceAcc b
fmap fn0 :: a -> b
fn0 r0 :: ReplaceAcc a
r0 = ReplaceAcc a
r0 { acc :: b
acc = a -> b
fn0 (a -> b) -> a -> b
forall a b. (a -> b) -> a -> b
$ ReplaceAcc a -> a
forall b. ReplaceAcc b -> b
acc ReplaceAcc a
r0 }


-- | Offset, Length
type PosLen = (MatchOffset, MatchLength)


{-| 'Left' String returns regex construction error -}
type E a = Either String a