Doubles.java
package church.primitives;

import church.lang.ByteStream;

public class Doubles {

    // Encoding to a stream
    public static ByteStream $encode(ByteStream stream, double a) {
        return Strings.encode(stream, Double.toString(a));
    }

    // Equality
    public static boolean $equal(double a, double b) {
        return a == b;
    }

    // Value bounds

    public static double min_value() {
        return -Double.MAX_VALUE;
    }

    public static double max_value() {
        return +Double.MAX_VALUE;
    }

    // Ring

    public static double additive_identity() {
        return 0;
    }

    public static double $sum(double a, double b) {
        return a + b;
    }

    public static double $neg(double a) {
        return -a;
    }

    public static double $sub(double a, double b) {
        return a - b;
    }

    public static double multiplicative_identity() {
        return 1;
    }

    public static double $prd(double a, double b) {
        return a * b;
    }

    public static double $pow(double x, double n) {
        return Math.pow(x, n);
    }

    // Field

    public static double $rcp(double a) {
        return 1 / a;
    }

    public static double $div(double a, double b) {
        return a / b;
    }

    // Ordering

    public static boolean $lt(double a, double b) {
        return a < b;
    }

    public static boolean $gt(double a, double b) {
        return a > b;
    }

    public static boolean $lte(double a, double b) {
        return a <= b;
    }

    public static boolean $gte(double a, double b) {
        return a >= b;
    }

    public static double min(double a, double b) { // todo don't copy these
        return Math.min(a, b);
    }

    public static double max(double a, double b) { // todo don't copy these
        return Math.max(a, b);
    }
}