Text between: Difference between revisions
Content added Content deleted
m (added related tasks.) |
m (→{{header|Haskell}}: Tidied, preferred bimap to (***)) |
||
Line 1,033:
=={{header|Haskell}}==
<lang Haskell>import
import Data.Bifunctor (bimap)
import Data.List (intercalate)
import Data.Maybe (fromMaybe)
import Data.Text (Text, breakOn, pack, stripPrefix, unpack)
textBetween ::
▲-- TEXT BETWEEN -----------------------------------------------------------
Text ->
Text
textBetween (start, end) txt =
let retain sub part delim t =▼
either (Just . const t) (sub $ part . flip breakOn t) delim▼
▲ in fromMaybe
>>= retain (
)
▲ (retain (stripPrefix <*>) snd start txt >>= retain (Just .) fst end)
where
either
(Just . const t)
delim
main :: IO ()▼
main = do▼
mapM_ print $
(putStrLn . unlines) $▼
zipWith▼
( \d t ->
intercalate
["\"", "\""]
)
(drop 3 delims)
▲-- TESTS ------------------------------------------------------------------
samples :: [Text]
samples =
pack
<$> [ "Hello Rosetta Code world",
"<table style=\"myTable\"><tr><td>"
<> "hello world</td></tr></table>"
]
delims :: [(Either String Text, Either String Text)]
delims =
<$> [ ("Hello ", " world"),
]
wrap :: String -> Either String Text
wrap x
| otherwise = Right (pack x)</lang>
▲ 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"
|