26 lines
825 B
Haskell
26 lines
825 B
Haskell
import Data.List (find, isPrefixOf)
|
|
|
|
multiSplit :: [String] -> String -> [(String, String, Int)]
|
|
multiSplit ds s =
|
|
let lng = length s
|
|
(ts, ps, o) =
|
|
foldl
|
|
(\(tokens, parts, offset) (c, i) ->
|
|
let inDelim = offset > i
|
|
in case (if inDelim
|
|
then Nothing
|
|
else find (`isPrefixOf` drop i s) ds) of
|
|
Just x -> ([], (tokens, x, i) : parts, i + length x)
|
|
Nothing ->
|
|
( if inDelim
|
|
then tokens
|
|
else c : tokens
|
|
, parts
|
|
, offset))
|
|
([], [], 0)
|
|
(zip s [0 .. lng])
|
|
in reverse $ (ts, [], lng) : ps
|
|
|
|
main :: IO ()
|
|
main = print $ multiSplit ["==", "!=", "="] "a!===b=!=c"
|