// Copyright (c) 2014, 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 'package:path/path.dart' as p;

/// A range from [min] to [max], inclusive.
class Range {
  /// The minimum value included by the range.
  final int min;

  /// The maximum value included by the range.
  final int max;

  /// Whether this range covers only a single number.
  bool get isSingleton => min == max;

  Range(this.min, this.max);

  /// Returns a range that covers only [value].
  Range.singleton(int value)
      : this(value, value);

  /// Whether [this] contains [value].
  bool contains(int value) => value >= min && value <= max;

  bool operator==(Object other) => other is Range &&
      other.min == min && other.max == max;

  int get hashCode => 3 * min + 7 * max;
}

/// An implementation of [Match] constructed by [Glob]s.
class GlobMatch implements Match {
  final String input;
  final Pattern pattern;
  final int start = 0;

  int get end => input.length;
  int get groupCount => 0;

  GlobMatch(this.input, this.pattern);

  String operator [](int group) => this.group(group);

  String group(int group) {
    if (group != 0) throw new RangeError.range(group, 0, 0);
    return input;
  }

  List<String> groups(List<int> groupIndices) =>
      groupIndices.map((index) => group(index)).toList();
}

final _quote = new RegExp(r"[+*?{}|[\]\\().^$-]");

/// Returns [contents] with characters that are meaningful in regular
/// expressions backslash-escaped.
String regExpQuote(String contents) =>
    contents.replaceAllMapped(_quote, (char) => "\\${char[0]}");

/// Returns [path] with all its separators replaced with forward slashes.
///
/// This is useful when converting from Windows paths to globs.
String separatorToForwardSlash(String path) {
  if (p.style != p.Style.windows) return path;
  return path.replaceAll('\\', '/');
}

/// Returns [path] which follows [context] converted to the POSIX format that
/// globs match against.
String toPosixPath(p.Context context, String path) {
  if (context.style == p.Style.windows) return path.replaceAll('\\', '/');
  if (context.style == p.Style.url) return Uri.decodeFull(path);
  return path;
}
