module GlobTree ( andNode, orNode, notNode, matchNode, boolNode, eval ) where import Text.Regex data GlobTree = BoolNode Bool | MatchNode Regex | OrNode GlobTree GlobTree | AndNode GlobTree GlobTree | NotNode GlobTree eval :: GlobTree -> String -> Bool eval (BoolNode b) _ = b eval (MatchNode x) s = case matchRegex x s of Nothing -> False Just _ -> True eval (NotNode t) s = not (eval t s) eval (OrNode l r) s = eval l s || eval r s eval (AndNode l r) s = eval l s && eval r s andNode :: GlobTree -> GlobTree -> GlobTree andNode (BoolNode False) _ = BoolNode False andNode _ (BoolNode False) = BoolNode False andNode (BoolNode True) r = r andNode l (BoolNode True) = l andNode l r = l `AndNode` r orNode :: GlobTree -> GlobTree -> GlobTree orNode (BoolNode True) _ = BoolNode True orNode _ (BoolNode True) = BoolNode True orNode (BoolNode False) r = r orNode l (BoolNode False) = l orNode l r = l `OrNode` r notNode :: GlobTree -> GlobTree notNode (BoolNode b) = BoolNode (not b) notNode t = NotNode t boolNode :: Bool -> GlobTree boolNode b = BoolNode b matchNode :: String -> GlobTree matchNode s = MatchNode (mkRegex s)