RosettaCodeData/Task/Multisplit/Haskell/multisplit-2.hs

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"