# contrast2

Utilities for comparing (and contrast2ing) 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:contrast2/contrast2.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)';
}
``````

## Libraries

contrast2
Utilities for comparing (and contrast2ing) dart values.