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 Data.Text (Text, pack, unpack, breakOn, stripPrefix)
<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 ((***))


----------------------- TEXT BETWEEN ---------------------


textBetween ::
-- TEXT BETWEEN -----------------------------------------------------------
textBetween :: (Either String Text, Either String Text) -> Text -> Text
(Either String Text, Either String Text) ->
Text ->
Text
textBetween (start, end) txt =
textBetween (start, end) txt =
fromMaybe
let retain sub part delim t =
(pack [])
either (Just . const t) (sub $ part . flip breakOn t) delim
( retain (stripPrefix <*>) snd start txt
in fromMaybe
(pack [])
>>= retain (Just .) fst end
)
(retain (stripPrefix <*>) snd start txt >>= retain (Just .) fst end)
where
retain sub part delim t =
either
(Just . const t)
(sub $ part . flip breakOn t)
delim

-------------------------- TESTS -------------------------
main :: IO ()
main = do
mapM_ print $
flip textBetween (head samples)
<$> take 3 delims
(putStrLn . unlines) $
zipWith
( \d t ->
intercalate
(unpack $ textBetween d t)
["\"", "\""]
)
(drop 3 delims)
(tail samples)


-- TESTS ------------------------------------------------------------------
samples :: [Text]
samples :: [Text]
samples =
samples =
pack <$>
pack
[ "Hello Rosetta Code world"
<$> [ "Hello Rosetta Code world",
, "</div><div style=\"chinese\">你好吗</div>"
"</div><div style=\"chinese\">你好吗</div>",
, "<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
"<text>Hello <span>Rosetta Code</span> world"
, "<table style=\"myTable\"><tr><td>hello world</td></tr></table>"
<> "</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 =
(wrap *** wrap) <$>
join bimap wrap
[ ("Hello ", " world")
<$> [ ("Hello ", " world"),
, ("start", " world")
("start", " world"),
, ("Hello", "end")
("Hello", "end"),
, ("<div style=\"chinese\">", "</div>")
("<div style=\"chinese\">", "</div>"),
, ("<text>", "<table>")
("<text>", "<table>"),
, ("<text>", "</table>")
("<text>", "</table>")
]
]


wrap :: String -> Either String Text
wrap :: String -> Either String Text
wrap x =
wrap x
if x `elem` ["start", "end"]
| x `elem` ["start", "end"] = Left x
| otherwise = Right (pack x)</lang>
then Left x
else Right (pack x)

main :: IO ()
main = do
mapM_ print $ flip textBetween (head samples) <$> take 3 delims
(putStrLn . unlines) $
zipWith
(\d t -> intercalate (unpack $ textBetween d t) ["\"", "\""])
(drop 3 delims)
(tail samples)</lang>
{{Out}}
{{Out}}
<pre>"Rosetta Code"
<pre>"Rosetta Code"