From d5bdc79002348178a6376387316505c708b77b06 Mon Sep 17 00:00:00 2001 From: Jan Sucan Date: Sat, 22 Apr 2023 16:25:42 +0200 Subject: ch08: Copy a needed file from the examples --- ch08/GlobRegex.hs | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 ch08/GlobRegex.hs diff --git a/ch08/GlobRegex.hs b/ch08/GlobRegex.hs new file mode 100644 index 0000000..1b847f4 --- /dev/null +++ b/ch08/GlobRegex.hs @@ -0,0 +1,55 @@ +{-- snippet type --} +module GlobRegex + ( + globToRegex + , matchesGlob + ) where + +import Text.Regex.Posix ((=~)) + +globToRegex :: String -> String +{-- /snippet type --} + +{-- snippet rooted --} +globToRegex cs = '^' : globToRegex' cs ++ "$" +{-- /snippet rooted --} + +{-- snippet asterisk --} +globToRegex' :: String -> String +globToRegex' "" = "" + +globToRegex' ('*':cs) = ".*" ++ globToRegex' cs + +globToRegex' ('?':cs) = '.' : globToRegex' cs + +globToRegex' ('[':'!':c:cs) = "[^" ++ c : charClass cs +globToRegex' ('[':c:cs) = '[' : c : charClass cs +globToRegex' ('[':_) = error "unterminated character class" + +globToRegex' (c:cs) = escape c ++ globToRegex' cs +{-- /snippet asterisk --} + +{- +{-- snippet last --} +globToRegex' (c:cs) = escape c ++ globToRegex' cs +{-- /snippet last --} +-} + +{-- snippet escape --} +escape :: Char -> String +escape c | c `elem` regexChars = '\\' : [c] + | otherwise = [c] + where regexChars = "\\+()^$.{}]|" +{-- /snippet escape --} + +{-- snippet charClass --} +charClass :: String -> String +charClass (']':cs) = ']' : globToRegex' cs +charClass (c:cs) = c : charClass cs +charClass [] = error "unterminated character class" +{-- /snippet charClass --} + +{-- snippet matchesGlob --} +matchesGlob :: FilePath -> String -> Bool +name `matchesGlob` pat = name =~ globToRegex pat +{-- /snippet matchesGlob --} -- cgit v1.2.3