1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
Operand : AbstractFunction {
var <>value;
*new { |value|
^super.newCopyArgs(value.dereferenceOperand)
}
dereferenceOperand {
^value
}
// MATH SUPPORT
composeUnaryOp { arg aSelector;
^this.class.new(value.perform(aSelector))
}
composeBinaryOp { arg aSelector, something, adverb;
^this.class.new(value.perform(aSelector, something, adverb))
}
reverseComposeBinaryOp { arg aSelector, something, adverb;
^this.class.new(something.perform(aSelector, value, adverb))
}
composeNAryOp { arg aSelector, anArgList;
^this.class.new(value.perform(aSelector, *anArgList))
}
// double dispatch for mixed operations
performBinaryOpOnSimpleNumber { arg aSelector, aNumber, adverb;
^this.class.new(aNumber.perform(aSelector, value, adverb))
}
performBinaryOpOnSignal { arg aSelector, aSignal, adverb;
^this.class.new(aSignal.perform(aSelector, value, adverb))
}
performBinaryOpOnComplex { arg aSelector, aComplex, adverb;
^this.class.new(aComplex.perform(aSelector, value, adverb))
}
performBinaryOpOnSeqColl { arg aSelector, aSeqColl, adverb;
^this.class.new(aSeqColl.perform(aSelector, value, adverb))
}
hash { arg obj;
^this.instVarHash([\value])
}
== { arg obj;
^this.compareObject(obj, [\value])
}
printOn { |stream|
stream << this.class.name << "(";
value !? { stream << value };
stream << ")"
}
storeOn { |stream|
stream << this.class.name << "(";
value !? { stream <<< value };
stream << ")"
}
}
|