Jump to content

Text between: Difference between revisions

m
→‎{{header|Haskell}}: Tidied, preferred bimap to (***)
m (added related tasks.)
m (→‎{{header|Haskell}}: Tidied, preferred bimap to (***))
Line 1,033:
 
=={{header|Haskell}}==
<lang Haskell>import DataControl.TextMonad (Text, pack, unpack, breakOn, stripPrefixjoin)
import Data.Bifunctor (bimap)
import Data.List (intercalate)
import Data.Maybe (fromMaybe)
import Data.Text (Text, breakOn, pack, stripPrefix, unpack)
import Control.Arrow ((***))
 
-- TEXT BETWEEN -------------------------------------- TEXT BETWEEN ---------------------
 
textBetween ::
-- TEXT BETWEEN -----------------------------------------------------------
textBetween :: (Either String Text, Either String Text) -> Text -> Text
Text ->
Text
textBetween (start, end) txt =
in fromMaybe
let retain sub part delim t =
else Right (pack x[])
either (Just . const t) (sub $ part . flip breakOn t) delim
( (retain (stripPrefix <*>) snd start txt >>= retain (Just .) fst end)
in fromMaybe
>>= retain (packJust [].) fst end
)
(retain (stripPrefix <*>) snd start txt >>= retain (Just .) fst end)
where
let retain sub part delim t =
either
(Just . const t)
either (Just . const t) (sub $ part . flip breakOn t) delim
delim
 
-- TESTS ----------------------------------------- TESTS -------------------------
main :: IO ()
main = do
mapM_ print $
mapM_ print $ flip textBetween (head samples) <$> take 3 delims
(drop<$> take 3 delims)
(putStrLn . unlines) $
zipWith
( \d t ->
intercalate
(\d t -> intercalate (unpack $ textBetween d t) ["\"", "\""])
["\"", "\""]
)
(drop 3 delims)
(tail samples)</lang>
 
-- TESTS ------------------------------------------------------------------
samples :: [Text]
samples =
pack <$>
<$> [ "Hello Rosetta Code world",
, "</div><div style=\"chinese\">你好吗</div>",
, "<text>Hello <span>Rosetta Code</span> world</text><table style=\"myTable\">"
, <> "</text><table style=\"myTable\"><tr><td>hello world</td></tr></table>",
"<table style=\"myTable\"><tr><td>"
]
<> "hello world</td></tr></table>"
]
 
delims :: [(Either String Text, Either String Text)]
delims =
(wrapjoin ***bimap wrap) <$>
<$> [ ("Hello ", " world"),
, ("start", " world"),
, ("Hello", "end"),
, ("<div style=\"chinese\">", "</div>"),
, ("<text>", "<table>"),
, ("<text>", "</table>")
]
 
wrap :: String -> Either String Text
wrap x =
if| 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}}
<pre>"Rosetta Code"
9,655

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.