docs: function makeSort(schemaKeys, hydrateAndValue) {
  	// Makes gt and lt functions that `helpers.sorter` can use
  	// to make a `compare` function for `Array.sort(compare)`.`
  	var sorters = {};
  	canReflect.eachKey(schemaKeys, function(schemaProp, key) {
  
  		sorters[key] = {
  			// valueA is GT valueB
  			$gt: function(valueA, valueB) {
  				// handle sorting with null / undefined values
  				if(valueA == null || valueB == null) {
  					return helpers.typeCompare.$gt(valueA, valueB);
  				}
  				// The following can certainly be done faster
  				var $gt = hydrateAndValue({
  						$gt: valueB
  					}, key, schemaProp,
  					helpers.valueHydrator);
  
  				var $eq = hydrateAndValue({
  						$eq: valueA
  					}, key, schemaProp,
  					helpers.valueHydrator);
  
  				return set.isEqual( set.union($gt, $eq), $gt );
  				/*
  				var hydratedIn =  hydrateAndValue({
  						$eq: valueA
  					}, key, schemaProp,
  					helpers.valueHydrator);
  				return $gt[isMemberSymbol](hydratedIn.values[0]);*/
  			},
  			$lt: function(valueA, valueB) {
  				if(valueA == null || valueB == null) {
  					return helpers.typeCompare.$lt(valueA, valueB);
  				}
  
  
  				var $lt = hydrateAndValue({
  						$lt: valueB
  					}, key, schemaProp,
  					helpers.valueHydrator);
  
  				var $eq = hydrateAndValue({
  						$eq: valueA
  					}, key, schemaProp,
  					helpers.valueHydrator);
  
  				return set.isEqual( set.union($lt, $eq), $lt );
  				/*
  				// This doesn't work because it will try to create new SetType(new In([]))
  				var hydratedValue =  hydrateAndValue({
  						$eq: valueA
  					}, key, schemaProp,
  					helpers.valueHydrator);
  				return $lt[isMemberSymbol](hydratedValue);*/
  
  				/*
  				// This doesn't work because of maybe types.
  				var hydratedIn =  hydrateAndValue({
  						$eq: valueA
  					}, key, schemaProp,
  					helpers.valueHydrator);
  				return $lt[isMemberSymbol](hydratedIn.values[0]); */
  			}
  		};
  	});
  
  	function Sort(key) {
  		this.key = key;
  		this.compare = helpers.sorter(key, sorters);
  	}
  
  	function identityIntersection(v1, v2) {
  		return v1.key === v2.key ? v1 : set.EMPTY;
  	}
  
  	function identityDifference(v1, v2) {
  		return v1.key === v2.key ? set.EMPTY : v1;
  	}
  
  	function identityUnion(v1, v2) {
  		return v1.key === v2.key ? v1 : set.UNDEFINABLE;
  	}
  	set.defineComparison(Sort, Sort, {
  		intersection: identityIntersection,
  		difference: identityDifference,
  		union: identityUnion
  	});
  	return Sort;
  }