AbstractConstraint
subclasses:
Constraint, SeenBefore, IsIn, IsNotIn, Every, Not, Any, Xor, CountLimit, IsEven, IsOdd, IsNil, NotNil
Constraints let you specify conditions in an OOP fashion.
You can perform logical operations on the constraint object itself to further
filter or refine your query.
(
// Create a constraint.
c =
Constraint({ arg obj; obj.even })
and: Constraint({ arg obj; obj % 4 == 0 })
and: (Constraint({ arg obj; obj == 8 }).not);
)
c is now a constraint object that can be used to validate that an input
is even, divisible by 4 and is not the number 8.
c.value(3)
c.value(8)
c.value(4)
c.value(12)
This can be used any place a function that returns true/false is required.
eg. select, reject, every, any
(
// run numbers through it
50.do({
n = 40.rand;
[n,c.value(n)].postln
});
)
It can be used in place of a function for
SequenceableCollections, Streams and Patterns
(
// filter a collection
Array.fill(100,{ 100.rand })
.select(c) // acts like a function
.do({ arg num; num.postln; });
)
(
// Use to filter a Pattern
p = Pseries(0,1,100)
.select(c);
)
// Unfiltered
Pseries(0,1,100).asStream.all.do({arg num; num.postln;})
// Filtered
p.asStream.all.do({ arg num; num.postln });
(
// and here is everybody that gets rejected by the constraint
p = Pseries(0,1,100)
.reject(c);
)
p.asStream.all.do({ arg num; num.postln });
The below example is expressed using only Constraint.
(
c =
Constraint({ arg obj; obj.even })
and: Constraint({ arg obj; obj % 4 == 0 })
and: (Constraint({ arg obj; obj == 8 }).not);
)
It could also be expressed this way
(
c =
IsEven.new and: Constraint({ arg obj; obj % 4 == 0 })
and: Constraint({ arg obj; obj != 8 });
)
Constraints respond to
.not
.or(aConstraint)
.and(aConstraint)
.xor(aConstraint)
.reject(aConstraint)
.select(aConstraint)
by returning a new compound constraint that expresses that logic.
(
c = IsEven.new;
d = Constraint({ arg num; num == 3 });
e = c or: d; // if its even or it is the number 3
)
(
c = IsEven.new;
d = Constraint({ arg num; num == 4 });
e = c.reject(d); // if its even and also reject it if it is the number 4
)