Index: lib/src/impl.dart |
diff --git a/lib/src/impl.dart b/lib/src/impl.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6a4053060ad7bc3e119ba928942f90716140b2cb |
--- /dev/null |
+++ b/lib/src/impl.dart |
@@ -0,0 +1,56 @@ |
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+import '../boolean_selector.dart'; |
+import 'ast.dart'; |
+import 'evaluator.dart'; |
+import 'intersection_selector.dart'; |
+import 'parser.dart'; |
+import 'union_selector.dart'; |
+import 'validator.dart'; |
+ |
+/// The concrete implementation of a [BooleanSelector] parsed from a string. |
+/// |
+/// This is separate from [BooleanSelector] so that [intersect] and [union] can |
+/// check to see whether they're passed a [BooleanSelectorImpl] or a different |
+/// class that implements [BooleanSelector]. |
+class BooleanSelectorImpl implements BooleanSelector { |
+ /// The parsed AST. |
+ final Node _selector; |
+ |
+ /// Parses [selector]. |
+ /// |
+ /// This will throw a [SourceSpanFormatException] if the selector is |
+ /// malformed or if it uses an undefined variable. |
+ BooleanSelectorImpl.parse(String selector) |
+ : _selector = new Parser(selector).parse(); |
+ |
+ BooleanSelectorImpl._(this._selector); |
+ |
+ Iterable<String> get variables => _selector.variables; |
+ |
+ bool evaluate(semantics) => _selector.accept(new Evaluator(semantics)); |
+ |
+ BooleanSelector intersection(BooleanSelector other) { |
+ if (other == BooleanSelector.all) return this; |
+ if (other == BooleanSelector.none) return other; |
+ return other is BooleanSelectorImpl |
+ ? new BooleanSelectorImpl._(new AndNode(_selector, other._selector)) |
+ : new IntersectionSelector(this, other); |
+ } |
+ |
+ BooleanSelector union(BooleanSelector other) { |
+ if (other == BooleanSelector.all) return other; |
+ if (other == BooleanSelector.none) return this; |
+ return other is BooleanSelectorImpl |
+ ? new BooleanSelectorImpl._(new OrNode(_selector, other._selector)) |
+ : new UnionSelector(this, other); |
+ } |
+ |
+ void validate(bool isDefined(String variable)) { |
+ _selector.accept(new Validator(isDefined)); |
+ } |
+ |
+ String toString() => _selector.toString(); |
+} |