• Example
• Installing
• Versions
• 9

# contrast

Utilities for comparing (and contrasting) dart values:

• Comparator combinators (by/compound/reverse/lexicographic/nullsFirst/nullsLast)
• Comparison operator mixin (Quantity)(<, <=, ==, >, >=)
• Find extrema of Comparables and Iterables (min/max/minOf/maxOf)
• Test and obtain clamped comparables (clamp/between)
• Test and obtain sorted iterables (sorted/isOrdered/isStrictlyOrdered)

#Example

``````
import 'package:contrast/contrast.dart';
import 'dart:math' as math;

main() {

// Easily define comparison operators (see Point class below).
assert(Point.ZERO < Point.UNIT);
assert(Point.UNIT >= Point.ZERO);
assert(Point.ZERO == new Point(0, 0));

// Find extrema of arbitrary comparables.
// (dart:math's min/max only work with numbers)
assert(min(Point.ZERO, Point.UNIT) == Point.ZERO);
assert(max(Point.ZERO, Point.UNIT) == Point.UNIT);
assert(clamp(new Point(1, 2), Point.ZERO, Point.UNIT) == Point.UNIT);
assert(between(new Point(0.5, 0.5), Point.ZERO, Point.UNIT));

// Find extrema of iterables.
var points = [Point.UNIT, new Point(1, 2), Point.ZERO, new Point(0, 1)];
assert(minOf(points) == Point.ZERO);
assert(maxOf(points) == new Point(1, 2));

// Sort into a new List easily ( vs. iterable.toList()..sort() ).
var sortedPoints = sorted(points);

// Check ordering of iterables.
assert(isOrdered(sortedPoints));
assert(isStrictlyOrdered(sortedPoints));

// Define comparators using combinator helpers...

// By key function
var byMagnitude = by((point) => point.magnitude);
assert(max(Point.ZERO, new Point(-1, -1),
compare: byMagnitude) == new Point(-1, -1));

// Compound
assert(max(Point.ZERO, new Point(-1, -1),
compare: compound([byMagnitude, Comparable.compare])) == new Point(-1, -1));

// Reversed
assert(max(Point.ZERO, Point.UNIT, compare: reverse()) == Point.ZERO);

// Lexicographic
assert(min([Point.ZERO, Point.UNIT], [Point.ZERO, new Point(2, 2)],
compare: lexicographic()).last == Point.UNIT);

// Null safe
var maybePoints = [Point.UNIT, null, Point.ZERO, null];
assert(sorted(maybePoints, compare: nullsFirst()).first == null);
assert(sorted(maybePoints, compare: nullsLast()).last == null);
}

// Mixin `Comparable`-based comparison operators with `Quantity`.
class Point extends Object with Quantity<Point> {

static Point ZERO = new Point(0, 0);
static Point UNIT = new Point(1, 1);

final num x, y;

num get magnitude => math.sqrt(x*x + y*y);

Point(this.x, this.y);

// Use comparator combinators`compound` and `by`.
static final _comparator = compound([by((p) => p.x), by((p) => p.y)]);

int compareTo(Point other) => _comparator(this, other);

toString() => '(\$x, \$y)';
}
``````

example/example.dart

``````import 'package:contrast/contrast.dart';
import 'dart:math' as math;

main() {

// Easily define comparison operators (see Point class below).
assert(Point.ZERO < Point.UNIT);
assert(Point.UNIT >= Point.ZERO);
assert(Point.ZERO == new Point(0, 0));

// Find extrema of arbitrary comparables.
// (dart:math's min/max only work with numbers)
assert(min(Point.ZERO, Point.UNIT) == Point.ZERO);
assert(max(Point.ZERO, Point.UNIT) == Point.UNIT);
assert(clamp(new Point(1, 2), Point.ZERO, Point.UNIT) == Point.UNIT);
assert(between(new Point(0.5, 0.5), Point.ZERO, Point.UNIT));

// Find extrema of iterables.
var points = [Point.UNIT, new Point(1, 2), Point.ZERO, new Point(0, 1)];
assert(minOf(points) == Point.ZERO);
assert(maxOf(points) == new Point(1, 2));

// Sort into a new List easily ( vs. iterable.toList()..sort() ).
var sortedPoints = sorted(points);

// Check ordering of iterables.
assert(isOrdered(sortedPoints));
assert(isStrictlyOrdered(sortedPoints));

// Define comparators using combinator helpers...

// By key function
var byMagnitude = by((point) => point.magnitude);
assert(max(Point.ZERO, new Point(-1, -1),
compare: byMagnitude) == new Point(-1, -1));

// Compound
assert(max(Point.ZERO, new Point(-1, -1),
compare: compound([byMagnitude, Comparable.compare])) == new Point(-1, -1));

// Reversed
assert(max(Point.ZERO, Point.UNIT, compare: reverse()) == Point.ZERO);

// Lexicographic
assert(min([Point.ZERO, Point.UNIT], [Point.ZERO, new Point(2, 2)],
compare: lexicographic()).last == Point.UNIT);

// Null safe
var maybePoints = [Point.UNIT, null, Point.ZERO, null];
assert(sorted(maybePoints, compare: nullsFirst()).first == null);
assert(sorted(maybePoints, compare: nullsLast()).last == null);
}

// Mixin `Comparable`-based comparison operators with `Quantity`.
class Point extends Object with Quantity<Point> {

static Point ZERO = new Point(0, 0);
static Point UNIT = new Point(1, 1);

final num x, y;

num get magnitude => math.sqrt(x*x + y*y);

Point(this.x, this.y);

// Use comparator combinators`compound` and `by`.
static final _comparator = compound([by((p) => p.x), by((p) => p.y)]);

int compareTo(Point other) => _comparator(this, other);

toString() => '(\$x, \$y)';
}
``````

## Use this package as a library

### 1. Depend on it

``````
dependencies:
contrast: ^0.1.1

``````

### 2. Install it

You can install packages from the command line:

with pub:

``````
\$ pub get

``````

Alternatively, your editor might support `pub get`. Check the docs for your editor to learn more.

### 3. Import it

Now in your Dart code, you can use:

``````
import 'package:contrast/contrast.dart';
``````
0.1.1 Sep 23, 2014
0.1.0 Sep 19, 2014
 Popularity: Describes how popular the package is relative to other packages. [more] 17 Health: Code health derived from static analysis. [more] 1 Maintenance: Reflects how tidy and up-to-date the package is. [more] 0 Overall: Weighted score of the above. [more] 9

We analyzed this package on Sep 18, 2018, and provided a score, details, and suggestions below. Analysis was completed with status completed using:

• Dart: 2.0.0
• pana: 0.12.3

#### Platforms

Detected platforms: unsure

Low code quality prevents platform classification.

#### Issues and suggestions

Fix platform conflicts.

Low code quality prevents platform classification.

Fix `lib/src/comparators.dart`.

Analysis of `lib/src/comparators.dart` failed with 5 errors:

line 14 col 27: The method tear-off 'compare' has type '(Comparable<dynamic>, Comparable<dynamic>) → int' that isn't of expected type '(dynamic, dynamic) → int'. This means its parameter or return type does not match what is expected.

line 45 col 27: The method tear-off 'compare' has type '(Comparable<dynamic>, Comparable<dynamic>) → int' that isn't of expected type '(dynamic, dynamic) → int'. This means its parameter or return type does not match what is expected.

line 58 col 27: The method tear-off 'compare' has type '(Comparable<dynamic>, Comparable<dynamic>) → int' that isn't of expected type '(dynamic, dynamic) → int'. This means its parameter or return type does not match what is expected.

line 80 col 45: The method tear-off 'compare' has type '(Comparable<dynamic>, Comparable<dynamic>) → int' that isn't of expected type '(dynamic, dynamic) → int'. This means its parameter or return type does not match what is expected.

line 93 col 44: The method tear-off 'compare' has type '(Comparable<dynamic>, Comparable<dynamic>) → int' that isn't of expected type '(dynamic, dynamic) → int'. This means its parameter or return type does not match what is expected.

Fix `lib/src/extrema.dart`.

Analysis of `lib/src/extrema.dart` failed with 6 errors, including:

line 8 col 41: The method tear-off 'compare' has type '(Comparable<dynamic>, Comparable<dynamic>) → int' that isn't of expected type '(dynamic, dynamic) → int'. This means its parameter or return type does not match what is expected.

line 15 col 41: The method tear-off 'compare' has type '(Comparable<dynamic>, Comparable<dynamic>) → int' that isn't of expected type '(dynamic, dynamic) → int'. This means its parameter or return type does not match what is expected.

line 25 col 58: The method tear-off 'compare' has type '(Comparable<dynamic>, Comparable<dynamic>) → int' that isn't of expected type '(dynamic, dynamic) → int'. This means its parameter or return type does not match what is expected.

line 33 col 57: The method tear-off 'compare' has type '(Comparable<dynamic>, Comparable<dynamic>) → int' that isn't of expected type '(dynamic, dynamic) → int'. This means its parameter or return type does not match what is expected.

line 47 col 27: The method tear-off 'compare' has type '(Comparable<dynamic>, Comparable<dynamic>) → int' that isn't of expected type '(dynamic, dynamic) → int'. This means its parameter or return type does not match what is expected.

Fix `lib/src/ordered.dart`.

Analysis of `lib/src/ordered.dart` failed with 2 errors:

line 9 col 27: The method tear-off 'compare' has type '(Comparable<dynamic>, Comparable<dynamic>) → int' that isn't of expected type '(dynamic, dynamic) → int'. This means its parameter or return type does not match what is expected.

line 17 col 27: The method tear-off 'compare' has type '(Comparable<dynamic>, Comparable<dynamic>) → int' that isn't of expected type '(dynamic, dynamic) → int'. This means its parameter or return type does not match what is expected.

Fix additional 3 files with analysis or formatting issues.

Additional issues in the following files:

• `lib/src/quantity.dart` (1 error, 1 hint)
• `lib/src/sorted.dart` (1 error)
• `lib/contrast.dart` (Run `dartfmt` to format `lib/contrast.dart`.)

Package is too old.

The package was released more than two years ago.

Maintain `CHANGELOG.md`.

Add SDK constraint in `pubspec.yaml`.