commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Bruno P. Kinoshita" <>
Subject [functor] CharacterRange, FloatRange, DoubleRange and open/closed intervals
Date Mon, 23 Jan 2012 00:15:47 GMT
Hi all, 

In functor, there are two ranges available: IntegerRange and LongRange. Both use a closed
open interval, i.e., the low limit is included in the range, while the high limit is not. 

In Perl, we can create a range of numbers too, using the range operator (..). Something like
0..10. What produces a closed interval (both 0 and 10 are included). And in Perl, we can create
a range of chars too. Like an alphabet, a..z. Again, a closed interval. 

With the current implementation of Ranges in functor, if I want a closed interval from 0 to
10, I have to create the following code (limited by 0 and 11), that produces a closed/open

IntegerRange range = newIntegerRange(0, 11);

Now, if I create a CharacterRange, the implementation would have to use a closed interval
(otherwise z would never be included).

CharacterRange range = newCharacterRange('a', 'z');

IMHO, we could change the current implementation, before the first release, to use a closed
interval. It means that it would always include the low and high limits. This way, both an
IntegerRange and a CharacterRange, would have the same behavior, respecting the Liskov Principle
of Substitution. What do you think? If that sounds reasonable, I could file an issue for the
change of behavior in JIRA, and another JIRA with an CharacterRange plus tests, and an example
for the web site.

Another thing, I have to use float intervals for fuzzy membership functions in a project.
As I am already using functor there, I thought I could create a FloatRange and a DoubleRange
for functor. What do you think? If this sounds good too, I will file an issue in JIRA for
this too, with tests and examples for the web site. 

I wrote a blog entry to organize my findings while I compared functor ranges with other API's
and programming languages, maybe someone will find it interesting -

There are other points in Integer and Long ranges that I found confusing. Like, if you call
isStopped() before, during the iteration or after you iterated over the elements, the result
is always false. Not sure if this is the right behavior for it. Perhaps this method could
be moved from Generator to a StoppableGenerator interface, that WhileGenerator, GenerateUntil
and others would implement (maybe even the IntegerRange, or a StoppableIntegerRange. Try creating
a IntegerRange from 0 to Integer.MAX_VALUE and print the values with a UnaryProcedure... that
may take some time :)

Thank you in advance!

Bruno P. Kinoshita

To unsubscribe, e-mail:
For additional commands, e-mail:

View raw message