"An open lower or upper bound of a [[bounded comparison operation|WithinOperation]].
 
 In an open bound, the [[endpoint]] is not a part of the designated interval;
 therefore, when dealing with real numbers, the interval has no minimum / maximum value,
 as you can get infinitely close to the endpoint without reaching it.
 
 For example, in the interval `0 < x < 1`, the values 0.9, 0.99, 0.999, etc. for `x`
 are all within the interval."
shared class OpenBound(endpoint)
        extends Bound() {
    
    shared actual ExistsNonemptyExpression endpoint;
    
    shared actual [ExistsNonemptyExpression] children = [endpoint];
    
    shared actual Result transform<out Result>(Transformer<Result> transformer)
            => transformer.transformOpenBound(this);
    
    shared actual Boolean equals(Object that) {
        if (is OpenBound that) {
            return endpoint == that.endpoint;
        } else {
            return false;
        }
    }
    
    shared actual Integer hash
            => 31 * endpoint.hash;
    
    shared OpenBound copy(ExistsNonemptyExpression endpoint = this.endpoint) {
        value ret = OpenBound(endpoint);
        copyExtraInfoTo(ret);
        return ret;
    }
}