headroom-0.2.2.0: src/Headroom/Regex.hs
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-|
Module : Headroom.Regex
Description : Helper functions for regular expressions
Copyright : (c) 2019-2020 Vaclav Svejcar
License : BSD-3-Clause
Maintainer : vaclav.svejcar@gmail.com
Stability : experimental
Portability : POSIX
Provides wrappers mainly around functions from "Text.Regex.PCRE.Light" that more
suits the needs of this application.
-}
module Headroom.Regex
( compile'
, joinPatterns
, match'
)
where
import RIO
import qualified RIO.Text as T
import Text.Regex.PCRE.Light ( Regex
, compile
)
import Text.Regex.PCRE.Light.Char8 ( match
, utf8
)
-- | Same as 'compile', but takes 'Text' on input and enables 'utf8' option
-- by default.
compile' :: Text -- ^ regular expression to be compiled
-> Regex -- ^ compiled regular expression
compile' regex = compile (encodeUtf8 regex) [utf8]
-- | Joins list of patterns into single regex string. If the input list is
-- empty, 'Nothing' is returned.
--
-- >>> joinPatterns ["^foo", "^bar"]
-- Just "^foo|^bar"
joinPatterns :: [Text] -- ^ list of patterns to join
-> Maybe Text -- ^ joined patterns
joinPatterns [] = Nothing
joinPatterns ps = Just $ T.intercalate "|" ps
-- | Same as 'match', but works with 'Text' and uses no additional options.
match' :: Regex -- ^ a PCRE regular expression value produced by compile
-> Text -- ^ the subject text to match against
-> Maybe [Text] -- ^ the result value
match' regex subject = fmap T.pack <$> match regex (T.unpack subject) []