avoid list lookup by parseToken

Minor optimisation to parsing of a preferred content expression.
This commit is contained in:
Joey Hess 2019-05-14 13:08:51 -04:00
parent c1957b6aeb
commit aa7710982b
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
5 changed files with 17 additions and 21 deletions

View file

@ -84,9 +84,9 @@ data ParseToken t
type ParseResult t = Either String (Token t) type ParseResult t = Either String (Token t)
parseToken :: [ParseToken t] -> String -> ParseResult t parseToken :: [ParseToken t] -> String -> ParseResult t
parseToken l t parseToken l t = case syntaxToken t of
| t `elem` tokens = Right $ token t Right st -> Right st
| otherwise = go l Left _ -> go l
where where
go [] = Left $ "near " ++ show t go [] = Left $ "near " ++ show t
go (SimpleToken s r : _) | s == t = r go (SimpleToken s r : _) | s == t = r

View file

@ -324,8 +324,8 @@ combiningOptions =
, shortopt ')' "close group of options" , shortopt ')' "close group of options"
] ]
where where
longopt o h = globalFlag (Limit.addToken o) ( long o <> help h <> hidden ) longopt o h = globalFlag (Limit.addSyntaxToken o) ( long o <> help h <> hidden )
shortopt o h = globalFlag (Limit.addToken [o]) ( short o <> help h <> hidden ) shortopt o h = globalFlag (Limit.addSyntaxToken [o]) ( short o <> help h <> hidden )
jsonOptions :: [GlobalOption] jsonOptions :: [GlobalOption]
jsonOptions = jsonOptions =

View file

@ -63,9 +63,9 @@ add l = Annex.changeState $ \s -> s { Annex.limit = prepend $ Annex.limit s }
prepend (BuildingMatcher ls) = BuildingMatcher $ l:ls prepend (BuildingMatcher ls) = BuildingMatcher $ l:ls
prepend _ = error "internal" prepend _ = error "internal"
{- Adds a new token. -} {- Adds a new syntax token. -}
addToken :: String -> Annex () addSyntaxToken :: String -> Annex ()
addToken = add . Utility.Matcher.token addSyntaxToken = either error add . Utility.Matcher.syntaxToken
{- Adds a new limit. -} {- Adds a new limit. -}
addLimit :: Either String (MatchFiles Annex) -> Annex () addLimit :: Either String (MatchFiles Annex) -> Annex ()

View file

@ -34,7 +34,7 @@ import qualified Annex.Branch
import qualified Annex import qualified Annex
import Logs import Logs
import Logs.UUIDBased import Logs.UUIDBased
import Utility.Matcher hiding (tokens) import Utility.Matcher
import Annex.FileMatcher import Annex.FileMatcher
import Annex.UUID import Annex.UUID
import Types.Group import Types.Group

View file

@ -20,8 +20,7 @@
module Utility.Matcher ( module Utility.Matcher (
Token(..), Token(..),
Matcher(..), Matcher(..),
token, syntaxToken,
tokens,
generate, generate,
match, match,
matchM, matchM,
@ -47,16 +46,13 @@ data Matcher op = MAny
deriving (Show, Eq) deriving (Show, Eq)
{- Converts a word of syntax into a token. Doesn't handle operations. -} {- Converts a word of syntax into a token. Doesn't handle operations. -}
token :: String -> Token op syntaxToken :: String -> Either String (Token op)
token "and" = And syntaxToken "and" = Right And
token "or" = Or syntaxToken "or" = Right Or
token "not" = Not syntaxToken "not" = Right Not
token "(" = Open syntaxToken "(" = Right Open
token ")" = Close syntaxToken ")" = Right Close
token t = error $ "unknown token " ++ t syntaxToken t = Left $ "unknown token " ++ t
tokens :: [String]
tokens = words "and or not ( )"
{- Converts a list of Tokens into a Matcher. -} {- Converts a list of Tokens into a Matcher. -}
generate :: [Token op] -> Matcher op generate :: [Token op] -> Matcher op