Revision d277b075
b/htools/Ganeti/Query/Filter.hs | ||
---|---|---|
144 | 144 |
-- | Verifies if a given item passes a filter. The runtime context |
145 | 145 |
-- might be missing, in which case most of the filters will consider |
146 | 146 |
-- this as passing the filter. |
147 |
-- |
|
148 |
-- Note: we use explicit recursion to reduce unneeded memory use; |
|
149 |
-- 'any' and 'all' do not play nice with monadic values, resulting in |
|
150 |
-- either too much memory use or in too many thunks being created. |
|
147 | 151 |
evaluateFilter :: ConfigData -> Maybe b -> a |
148 | 152 |
-> Filter (FieldGetter a b) |
149 | 153 |
-> ErrorResult Bool |
150 | 154 |
evaluateFilter _ _ _ EmptyFilter = Ok True |
151 |
evaluateFilter c mb a (AndFilter flts) = |
|
152 |
all id <$> mapM (evaluateFilter c mb a) flts |
|
153 |
evaluateFilter c mb a (OrFilter flts) = |
|
154 |
any id <$> mapM (evaluateFilter c mb a) flts |
|
155 |
evaluateFilter c mb a (AndFilter flts) = helper flts |
|
156 |
where helper [] = Ok True |
|
157 |
helper (f:fs) = do |
|
158 |
v <- evaluateFilter c mb a f |
|
159 |
if v |
|
160 |
then helper fs |
|
161 |
else Ok False |
|
162 |
evaluateFilter c mb a (OrFilter flts) = helper flts |
|
163 |
where helper [] = Ok False |
|
164 |
helper (f:fs) = do |
|
165 |
v <- evaluateFilter c mb a f |
|
166 |
if v |
|
167 |
then Ok True |
|
168 |
else helper fs |
|
155 | 169 |
evaluateFilter c mb a (NotFilter flt) = |
156 | 170 |
not <$> evaluateFilter c mb a flt |
157 | 171 |
evaluateFilter c mb a (TrueFilter getter) = |
Also available in: Unified diff