File: Primitive.hs

package info (click to toggle)
haskell-glob 0.7.5-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 192 kB
  • sloc: haskell: 1,193; makefile: 2
file content (57 lines) | stat: -rw-r--r-- 2,183 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
-- File created: 2009-01-17

-- |A number of primitives from which complete 'Pattern's may be constructed.
--
-- Using this together with the functions provided by the 'Monoid' instance of
-- 'Pattern' allows for direct manipulation of 'Pattern's beyond what can be
-- done with just the 'compile' family of functions. And of course you don't
-- have to go via 'String's if you use these.
module System.FilePath.Glob.Primitive
   ( literal
   , singleWildcard, wildcard, recursiveWildcard
   , charRange, numberRange
   ) where

import System.FilePath (isPathSeparator, isExtSeparator)

import System.FilePath.Glob.Base (Pattern(..), Token(..), optimize)

-- |A 'Pattern' which matches the given 'String' literally.
--
-- Handles any embedded path and extension separators.
literal :: String -> Pattern
literal = optimize . Pattern . map f
 where
   f c | isPathSeparator c = PathSeparator
       | isExtSeparator c  = ExtSeparator
       | otherwise         = Literal c

-- |Matches any single character except a path separator: corresponds to the
-- @?@ operator.
singleWildcard :: Pattern
singleWildcard = Pattern [NonPathSeparator]

-- |Matches any number of characters up to a path separator: corresponds to the
-- @*@ operator.
wildcard :: Pattern
wildcard = Pattern [AnyNonPathSeparator]

-- |Matches any number of characters including path separators: corresponds to
-- the @**/@ operator.
recursiveWildcard :: Pattern
recursiveWildcard = Pattern [AnyDirectory]

-- |Matches a single character if it is within the (inclusive) range in any
-- 'Right' or if it is equal to the character in any 'Left'. Corresponds to the
-- @[]@, @[^]@ and @[!]@ operators.
--
-- If the given 'Bool' is 'False', the result of the match is inverted: the
-- match succeeds if the character does /not/ match according to the above
-- rules.
charRange :: Bool -> [Either Char (Char,Char)] -> Pattern
charRange b rs = optimize $ Pattern [CharRange b rs]

-- |Matches a number in the given range, which may be open, half-open, or
-- closed. Corresponds to the @\<\>@ operator.
numberRange :: Maybe Integer -> Maybe Integer -> Pattern
numberRange a b = Pattern [OpenRange (fmap show a) (fmap show b)]