"Given a stream of [[Comparable]] values, return the smallest value in the stream, or `null` if the stream is empty. For any nonempty stream `it`, `min(it)` evaluates to the first element of `it` such that for every element `e` of `it`, `min(it) <= e`. Any value `x` which violates the reflexivity requirement of [[Object.equals]] such that `x!=x` is skipped, unless it is the last element in the stream. Thus, for a stream of [[Float]]s, `min()` will not return an [[undefined value|Float.undefined]] unless every element of the stream is undefined." see (`interface Comparable`, `function max`, `function smallest`, `function Integer.min`, `function Float.min`) tagged("Comparisons", "Streams") shared native Absent|Value min<Value,Absent> (Iterable<Value,Absent> values) given Value satisfies Comparable<Value> given Absent satisfies Null; shared native("js") Absent|Value min<Value,Absent> (Iterable<Value,Absent> values) given Value satisfies Comparable<Value> given Absent satisfies Null { value it = values.iterator(); if (!is Finished first = it.next()) { variable value min = first; while (min!=min, //quick test for NaN !is Finished val = it.next()) { min = val; } while (!is Finished val = it.next()) { if (val<min) { min = val; } } return min; } else { "iterable must be empty" assert (is Absent null); return null; } } shared native("jvm") Absent|Value min<Value,Absent> (Iterable<Value,Absent> values) given Value satisfies Comparable<Value> given Absent satisfies Null { value it = values.iterator(); switch (first = it.next()) case (is Finished) { "iterable must be empty" assert (is Absent null); return null; } case (is Integer) { variable Integer min = first; while (is Integer val = it.next()) { if ((val of Integer) < min) { min = val; } } assert (is Value result = min); return result; } case (is Float) { variable Float min = first; while (min!=min, is Float val = it.next()) { min = val; } while (is Float val = it.next()) { if ((val of Float) < min) { min = val; } } assert (is Value result = min); return result; } else { variable value min = first; //exactly reproduce behavior on JS above while (min!=min, !is Finished val = it.next()) { min = val; } while (!is Finished val = it.next()) { if (val<min) { min = val; } } return min; } }