package ceylon;

public final class Integer
{
    private final long value;
    private Integer(long l) {
        value = l;
    }

    public static ceylon.Integer instance(long l) {
        return new ceylon.Integer(l);
    }

    public ceylon.Integer plus(ceylon.Integer op) {
        return instance(value + op.value);
    }

    public ceylon.Integer minus(ceylon.Integer op) {
        return instance(value - op.value);
    }

    public ceylon.Integer times(ceylon.Integer op) {
        return instance(value * op.value);
    }

    public ceylon.Integer divided(ceylon.Integer op) {
        return instance(value / op.value);
    }

    public ceylon.Integer remainder(ceylon.Integer op) {
        return instance(value % op.value);
    }

    public ceylon.Integer power(ceylon.Integer op) {
        return instance((long) Math.pow(value, op.value)); // FIXME: ugly
    }

    public ceylon.Integer and(ceylon.Integer op) {
        return instance(value & op.value);
    }

    public ceylon.Integer or(ceylon.Integer op) {
        return instance(value | op.value);
    }

    public ceylon.Integer xor(ceylon.Integer op) {
        return instance(value ^ op.value);
    }

    public ceylon.String asString() {
        return ceylon.String.instance(java.lang.Long.toString(value));
    }
}

package ceylon;

public final class Integer
{
    private final long value;
    private Integer(long l) {
        value = l;
    }

    public static ceylon.Integer instance(long l) {
        return new ceylon.Integer(l);
    }

    public ceylon.Integer operatorAdd(ceylon.Integer op) {
        return instance(value + op.value);
    }

    public ceylon.Integer operatorSubtract(ceylon.Integer op) {
        return instance(value - op.value);
    }

    public ceylon.Integer operatorMultiply(ceylon.Integer op) {
        return instance(value * op.value);
    }

    public ceylon.Integer operatorPower(ceylon.Integer op) {
        return instance((long) Math.pow(value, op.value)); // FIXME: ugly
    }

    public ceylon.Integer operatorDivide(ceylon.Integer op) {
        return instance(value / op.value);
    }

    public ceylon.Integer operatorModulo(ceylon.Integer op) {
        return instance(value % op.value);
    }

    public ceylon.Integer operatorBitwiseAnd(ceylon.Integer op) {
        return instance(value & op.value);
    }

    public ceylon.Integer operatorBitwiseOr(ceylon.Integer op) {
        return instance(value | op.value);
    }

    public ceylon.Integer operatorBitwiseXor(ceylon.Integer op) {
        return instance(value ^ op.value);
    }

    public ceylon.String asString() {
        return ceylon.String.instance(java.lang.Long.toString(value));
    }
}

Revert "9a1bea4716dc: Change method names to match the spec". I'd assumed the names in the spec were prescriptive, but not all operators have them so I think in fact they are just to illustrate what's happening. Either way, the specified names are inconsistent, and I think they might be English slang. They certainly don't match what other languages use.