Text between: Difference between revisions
Content added Content deleted
m (added related tasks.) |
m (→{{header|Haskell}}: Tidied, preferred bimap to (***)) |
||
Line 1,033: | Line 1,033: | ||
=={{header|Haskell}}== |
=={{header|Haskell}}== |
||
<lang Haskell>import |
<lang Haskell>import Control.Monad (join) |
||
import Data.Bifunctor (bimap) |
|||
import Data.List (intercalate) |
import Data.List (intercalate) |
||
import Data.Maybe (fromMaybe) |
import Data.Maybe (fromMaybe) |
||
import Data.Text (Text, breakOn, pack, stripPrefix, unpack) |
|||
import Control.Arrow ((***)) |
|||
⚫ | |||
textBetween :: |
|||
⚫ | |||
(Either String Text, Either String Text) -> |
|||
Text -> |
|||
Text |
|||
textBetween (start, end) txt = |
textBetween (start, end) txt = |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
( |
>>= retain (Just .) fst end |
||
) |
|||
⚫ | |||
where |
|||
⚫ | |||
either |
|||
(Just . const t) |
|||
⚫ | |||
delim |
|||
⚫ | |||
⚫ | |||
⚫ | |||
mapM_ print $ |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
( \d t -> |
|||
intercalate |
|||
⚫ | |||
["\"", "\""] |
|||
) |
|||
(drop 3 delims) |
|||
⚫ | |||
⚫ | |||
samples :: [Text] |
samples :: [Text] |
||
samples = |
samples = |
||
pack |
pack |
||
[ "Hello Rosetta Code world" |
<$> [ "Hello Rosetta Code world", |
||
"</div><div style=\"chinese\">你好吗</div>", |
|||
"<text>Hello <span>Rosetta Code</span> world" |
|||
<> "</text><table style=\"myTable\">", |
|||
"<table style=\"myTable\"><tr><td>" |
|||
] |
|||
<> "hello world</td></tr></table>" |
|||
] |
|||
delims :: [(Either String Text, Either String Text)] |
delims :: [(Either String Text, Either String Text)] |
||
delims = |
delims = |
||
join bimap wrap |
|||
[ ("Hello ", " world") |
<$> [ ("Hello ", " world"), |
||
("start", " world"), |
|||
("Hello", "end"), |
|||
("<div style=\"chinese\">", "</div>"), |
|||
("<text>", "<table>"), |
|||
("<text>", "</table>") |
|||
] |
] |
||
wrap :: String -> Either String Text |
wrap :: String -> Either String Text |
||
wrap x |
wrap x |
||
| x `elem` ["start", "end"] = Left x |
|||
| otherwise = Right (pack x)</lang> |
|||
then Left x |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
{{Out}} |
{{Out}} |
||
<pre>"Rosetta Code" |
<pre>"Rosetta Code" |