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

29 lines
848 B
Haskell
Raw Permalink Normal View History

2017-09-23 10:01:46 +02:00
import Data.List
(isPrefixOf, stripPrefix, genericLength, intercalate)
2015-02-20 00:35:01 -05:00
2017-09-23 10:01:46 +02:00
trysplit :: String -> [String] -> Maybe (String, String)
2015-02-20 00:35:01 -05:00
trysplit s delims =
2017-09-23 10:01:46 +02:00
case filter (`isPrefixOf` s) delims of
[] -> Nothing
(d:_) -> Just (d, (\(Just x) -> x) $ stripPrefix d s)
2015-02-20 00:35:01 -05:00
2017-09-23 10:01:46 +02:00
multisplit :: String -> [String] -> [(String, String, Int)]
2015-02-20 00:35:01 -05:00
multisplit list delims =
2017-09-23 10:01:46 +02:00
let ms [] acc pos = [(acc, [], pos)]
2015-02-20 00:35:01 -05:00
ms l@(s:sx) acc pos =
case trysplit l delims of
2017-09-23 10:01:46 +02:00
Nothing -> ms sx (s : acc) (pos + 1)
Just (d, sxx) -> (acc, d, pos) : ms sxx [] (pos + genericLength d)
2015-02-20 00:35:01 -05:00
in ms list [] 0
main :: IO ()
main = do
2017-09-23 10:01:46 +02:00
let parsed = multisplit "a!===b=!=c" ["==", "!=", "="]
mapM_
putStrLn
[ "split string:"
, intercalate "," $ map (\(a, _, _) -> a) parsed
, "with [(string, delimiter, offset)]:"
, show parsed
]