// 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 'union_selector.dart';

/// A selector that matches inputs that both of its sub-selectors match.
class IntersectionSelector implements BooleanSelector {
  final BooleanSelector _selector1;
  final BooleanSelector _selector2;

  @override
  Iterable<String> get variables sync* {
    yield* _selector1.variables;
    yield* _selector2.variables;
  }

  IntersectionSelector(this._selector1, this._selector2);

  @override
  bool evaluate(bool Function(String variable) semantics) =>
      _selector1.evaluate(semantics) && _selector2.evaluate(semantics);

  @override
  BooleanSelector intersection(BooleanSelector other) =>
      IntersectionSelector(this, other);

  @override
  BooleanSelector union(BooleanSelector other) => UnionSelector(this, other);

  @override
  void validate(bool Function(String variable) isDefined) {
    _selector1.validate(isDefined);
    _selector2.validate(isDefined);
  }

  @override
  String toString() => '($_selector1) && ($_selector2)';

  @override
  bool operator ==(Object other) =>
      other is IntersectionSelector &&
      _selector1 == other._selector1 &&
      _selector2 == other._selector2;

  @override
  int get hashCode => _selector1.hashCode ^ _selector2.hashCode;
}
