All:  I have merged Bruno's work to
https://svn.apache.org/repos/asf/commons/proper/functor/branches/FUNCTOR-14-mmbased
on functor's multi-module reorg.

Matt


On Wed, Sep 19, 2012 at 2:12 AM, Simone Tripodi <simonetrip...@apache.org>wrote:

> Olá Bruno,
>
> excellent work, congrats!! I will have a look tonight (my local TZ)
> I'll try to let you know ASAP!
>
> thanks, all the best!
> -Simo
>
> http://people.apache.org/~simonetripodi/
> http://simonetripodi.livejournal.com/
> http://twitter.com/simonetripodi
> http://www.99soft.org/
>
>
> On Wed, Sep 19, 2012 at 4:12 AM, Bruno P. Kinoshita
> <brunodepau...@yahoo.com.br> wrote:
> > Hi all,
> >
> > me again bringing a new implementation idea for the Generators API
> >
> > in [functor], and looking forward to some thoughts on this :-)
> >
> > There is a separate branch for this issue [1], and here's what has been
> done.
> >
> > - Split Generator interface into Generator interface and LoopGenerator
> > (abstract class). IMO, this will help in modularization (see this
> discussion [2])
> > in the Generators API, as the stop() method and the wrapped generators,
> > for instance, had been added because of the generators created for
> handling
> > execution flow control (e.g.: GenerateWhile, UntilGenerate, etc).
> >
> > - Moved LoopGenerator and its implementations under the newly created
> > org.apache.commons.functor.generator.loop package.
> >
> > - Moved IntegerRange and LongRange from
> org.apache.commons.functor.generator.util to
> > the newly created org.apache.commons.functor.generator.range package.
> >
> > - Created a Range API, with a Range interface, a Ranges helper interface
> and
> > some implementations (including existing IntegerRange and LongRange, and
> new
> > ones like DoubleRange, FloatRange and CharacterRange).
> >
> > - Added steps different than 1 to Ranges (not the generator interface,
> as this
> > is related only to ranges).
> >
> > - The Ranges implemented are all Generators too, what is very
> convenient, as you
> > can use Ranges to both define intervals and/or execute a procedure for
> each of its
> > elements.
> >
> > I've wrote a sample code using the existing Generators API [3] and wrote
> the
> > same code for the new Generators API [4]. The API is compatible, but as
> some
> > packages changed, you have to update existing code (but as [functor]
> hasn't been
> > released yet, it shouldn't be a problem I believe :-). Both codes
> produce the
> > same output too (0 1 2 3 4 5 6 7 8 9 ).
> >
> > And here's an example [5] of creating Ranges and using them as
> Generators. More
> > examples can be found in the tests for the Generator and the Range API's.
> >
> > I've updated the examples page and added tests. I've also updated the
> parent
> > pom to 26, but as this is not related to the FUNCTOR-14 issue, we can
> drop this
> >
> > part when merging the code.
> >
> > I'll merge the changes to trunk if everybody thinks this new
> implementation is
> > better than the current one.
> >
> > A side note: PHP recently got generators too [6], and an interesting
> thing that I noticed in
> > their Wiki was the discussion about callback functions. After reading the
> > discussion, for me it looks like [functor] generators API is more
> similar to
> > callback handler. Differently than the Python and PHP implementations
> with the
> > yield statement.
> >
> > Thank you in advance!
> >
> > [1]
> https://svn.apache.org/repos/asf/commons/proper/functor/branches/generators-FUNCTOR-14
> > [2] http://markmail.org/message/nymsk7l64aj4csxi
> > [3] https://gist.github.com/3747204
> > [4] https://gist.github.com/3747207
> > [5] https://gist.github.com/3747224
> > [5] https://wiki.php.net/rfc/generators
> >
> > Bruno P. Kinoshita
> > http://kinoshita.eti.br
> > http://tupilabs.com
> >
> >>________________________________
> >> From: Matt Benson <gudnabr...@gmail.com>
> >>To: Bruno P. Kinoshita <brunodepau...@yahoo.com.br>
> >>Cc: Commons Developers List <dev@commons.apache.org>
> >>Sent: Wednesday, 6 June 2012 9:56 AM
> >>Subject: Re: [functor] Patch for FUNCTOR-14, new Generators and Ranges
> >>
> >>On Tue, Jun 5, 2012 at 11:48 PM, Bruno P. Kinoshita
> >><brunodepau...@yahoo.com.br> wrote:
> >>> Hi Matt,
> >>>
> >>>
> >>>> Would there be a type of Range that could not be turned into a
> >>>> Generator given a compatible Step parameter?  If not, we could define:
> >>>>
> >>>> interface Range<T, S>  {
> >>>> ...
> >>>>    Generator<T>  toGenerator(S step);
> >>>> }
> >>>>
> >>>> This way, Range itself does not contain a step, but still maintains
> >>>> control over how a step is used to create a generator.
> >>>
> >>> I can't think of any type that could not be turned into a generator
> given
> >>> the step parameter. But if a range has no step, I think we would have
> to
> >>> remove the isEmpty(), contains(), containsAll() methods from range
> >>> implementations, as using steps higher than 1, we need to use the step
> value
> >>> to check if a range is empty or contains a certain element (e.g.:
> integer
> >>> range (1, 2], step 3, check if contains(2) or isEmpty()).
> >>>
> >>
> >>My thought was that by decoupling a Range from a step, you use only
> >>the bound types/values to determine inclusion of a given value.  If a
> >>Generator is created from (1, 2] with step 3, then that Generator will
> >>only return 1, but that doesn't reflect on the Range, IMO.
> >>
> >>Matt
> >>
> >>>
> >>>> Either way, I like the notion that a Range is its own type that just
> >>>> *happens* to either provide access to, or an implementation of,
> >>>> Generator.
> >>>
> >>> +1, let it provide access or be an implementation of Generator. In
> case we
> >>> do the latter case, I believe isEmpty(), contains() and other methods
> using
> >>> the step value would be doable.
> >>>
> >>> Regards,
> >>>
> >>>
> >>> Bruno P. Kinoshita
> >>> http://www.kinoshita.eti.br
> >>> http://www.tupilabs.com
> >>>
> >>> On 06/05/2012 11:52 PM, Matt Benson wrote:
> >>>>
> >>>> Hi, Bruno.  Likewise, answers inline:
> >>>>
> >>>> On Tue, Jun 5, 2012 at 9:32 PM, Bruno P. Kinoshita
> >>>> <brunodepau...@yahoo.com.br>  wrote:
> >>>>>
> >>>>> Hi Matt!
> >>>>>
> >>>>> Thanks for your response! Answers added inline.
> >>>>>
> >>>>>
> >>>>>> 1.  Why are a Range's type and step-type potentially different
> >>>>>> (different type variables, etc.)?
> >>>>>
> >>>>>
> >>>>> When I started writing this patch, the range's type and step-type
> were
> >>>>> the
> >>>>> same (i.e. the interface had only one generics type,<T>), but then I
> >>>>> created the CharacterRange and it didn't work because its range type
> is
> >>>>> Character and its step-type is Integer (same would happen for a
> >>>>> DateRange).
> >>>>
> >>>>
> >>>> I see; good point.
> >>>>
> >>>>>
> >>>>> What do you think? Maybe with some generics magic or with a different
> >>>>> approach we could remove the step-type? (I would be +1 for this)
> >>>>>
> >>>>>
> >>>>>> 2.  Why, if it is a Generator's responsibility to generate items
> >>>>>> subsequent to the lower endpoint, is the step part of the range at
> >>>>>> all? Based on [1], which definition of "range" are we attempting to
> >>>>>> represent?
> >>>>>
> >>>>>
> >>>>> In google guava and java-yield a range is a generator, as it was in
> >>>>> [functor] too (this patch removes the old IntegerRange, a generator
> of
> >>>>> Integers).
> >>>>>
> >>>>> [functor] has generators that don't require steps (GenerateWhile,
> >>>>> WhileGenerate, UntilGenerate, etc). I think random generators
> wouldn't
> >>>>> use
> >>>>> steps too (e.g.: RandomIntegerGenerator, USPhoneNumberGenerator,
> >>>>> UUIDGenerator, PrimeNumberGenerator).
> >>>>>
> >>>>> The initial idea of the Range interface, was to have similar
> behavior as
> >>>>> commons-lang's Range [1], plus being able to define steps and have
> the
> >>>>> actual process (the yield) being executed by an external agent, a
> >>>>> generator.
> >>>>> In the end, I think the of the Range in my patch would be more like
> an
> >>>>> Interval [2]?.
> >>>>>
> >>>>>
> >>>>>> The current code seems to implement definition 2 and
> >>>>>> *part* of definition 3, deferring the rest to a corresponding
> >>>>>> Generator.
> >>>>>
> >>>>>
> >>>>> I couldn't have said it better :-)
> >>>>>
> >>>>>
> >>>>>> Settling the question of whether [functor]'s Range is a
> >>>>>> "2-range" or also a "3-range" would seem to dictate our action:  do
> we
> >>>>>> move the step to the generator, or do we make Range calculate each
> >>>>>> item (in which case would it be simpler for Range to implement
> >>>>>> Generator)?
> >>>>>
> >>>>>
> >>>>> After reading your considerations, I now think that it would be
> better to
> >>>>> maintain the current approach (Range implements a Generator) and try
> to
> >>>>> implement generators for double, float and character using the actual
> >>>>> interfaces and try to use steps. What do you think?
> >>>>
> >>>>
> >>>> Would there be a type of Range that could not be turned into a
> >>>> Generator given a compatible Step parameter?  If not, we could define:
> >>>>
> >>>> interface Range<T, S>  {
> >>>> ...
> >>>>   Generator<T>  toGenerator(S step);
> >>>> }
> >>>>
> >>>> This way, Range itself does not contain a step, but still maintains
> >>>> control over how a step is used to create a generator.
> >>>>
> >>>>>
> >>>>> Do you think we should keep the naming standard
> IntegerRange/LongRange,
> >>>>> or
> >>>>> change them to IntegerGenerator/LongGenerator?
> >>>>
> >>>>
> >>>> Either way, I like the notion that a Range is its own type that just
> >>>> *happens* to either provide access to, or an implementation of,
> >>>> Generator.
> >>>>
> >>>> br,
> >>>> Matt
> >>>>
> >>>>>
> >>>>> Thank you for reviewing my patch and for the interesting questions!
> I'm
> >>>>> no
> >>>>> FP expert either, feel free to suggest different ideas, no hard
> feelings
> >>>>> :)
> >>>>>
> >>>>> [1]
> >>>>>
> >>>>>
> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/Range.java?view=markup
> >>>>> [2] http://en.wikipedia.org/wiki/Interval_(mathematics)
> >>>>>
> >>>>> Bruno P. Kinoshita
> >>>>> http://www.kinoshita.eti.br
> >>>>> http://www.tupilabs.com
> >>>>>
> >>>>>
> >>>>> On 06/05/2012 12:08 PM, Matt Benson wrote:
> >>>>>>
> >>>>>>
> >>>>>> Hi, Bruno!
> >>>>>>
> >>>>>>   I have some questions:
> >>>>>>
> >>>>>> 1.  Why are a Range's type and step-type potentially different
> >>>>>> (different type variables, etc.)?
> >>>>>> 2.  Why, if it is a Generator's responsibility to generate items
> >>>>>> subsequent to the lower endpoint, is the step part of the range at
> >>>>>> all?  Based on [1], which definition of "range" are we attempting to
> >>>>>> represent?  The current code seems to implement definition 2 and
> >>>>>> *part* of definition 3, deferring the rest to a corresponding
> >>>>>> Generator.  Settling the question of whether [functor]'s Range is a
> >>>>>> "2-range" or also a "3-range" would seem to dictate our action:  do
> we
> >>>>>> move the step to the generator, or do we make Range calculate each
> >>>>>> item (in which case would it be simpler for Range to implement
> >>>>>> Generator)?
> >>>>>>
> >>>>>> I am by no means an FP or any other type of expert, so feel free to
> >>>>>> show me why I'm wrong on a given point!
> >>>>>>
> >>>>>> br,
> >>>>>> Matt
> >>>>>>
> >>>>>> [1] http://en.wikipedia.org/wiki/Range_(computer_science)
> >>>>>>
> >>>>>> On Mon, Jun 4, 2012 at 11:59 PM, Bruno P. Kinoshita
> >>>>>> <brunodepau...@yahoo.com.br>    wrote:
> >>>>>>>
> >>>>>>>
> >>>>>>> Hi all,
> >>>>>>>
> >>>>>>> I've finished a patch for FUNCTOR-14, regarding the Generators API
> in
> >>>>>>> [functor]. I'd like to hear what others think about what was done
> >>>>>>> before
> >>>>>>> attaching the patch to JIRA:
> >>>>>>>
> >>>>>>> - Didn't change the Generator interface. Although I commented in
> the
> >>>>>>> issue about removing the stop() and isStopped() methods and moving
> to a
> >>>>>>> different interface, it would require a major refactoring, as many
> >>>>>>> other
> >>>>>>> generators are built upon this idea.
> >>>>>>>
> >>>>>>> - Created IntegerGenerator, LongGenerator, FloatGenerator,
> >>>>>>> DoubleGenerator and CharacterGenerator. Didn't implement a
> >>>>>>> DateGenerator as
> >>>>>>> it would require more time and a discussion on how to use days,
> months,
> >>>>>>> years, days of week, etc.
> >>>>>>>
> >>>>>>> - Introduced Ranges, with the following initial ranges:
> IntegerRange,
> >>>>>>> LongRange, FloatRange, DoubleRange and CharacterRange. This API is
> >>>>>>> quite
> >>>>>>> similar to other existing APIs, with the difference that you can
> >>>>>>> specify the
> >>>>>>> step (like ranges in Matlab)
> >>>>>>>
> >>>>>>> - The generators that use numbers (there are many other generators,
> >>>>>>> like
> >>>>>>> GenerateWhile, GenerateUntil, etc) use ranges to create the
> series. The
> >>>>>>> objects are created only when the generator is executed, calling a
> >>>>>>> procedure. Like in python, but instead of retrieving the value
> with a
> >>>>>>> 'yield' statement, we give a procedure to be executed using the
> value
> >>>>>>> created.
> >>>>>>>
> >>>>>>> - Included tests to cover the changes.
> >>>>>>>
> >>>>>>> - Updated web site examples.
> >>>>>>>
> >>>>>>> All the tests passed, no checkstyle/pmd/findbugs errors. The
> character
> >>>>>>> range/generator is a very simple, and there are some operations
> with
> >>>>>>> double/float in the ranges and generators. I keep my code mirrored
> in
> >>>>>>> github
> >>>>>>> too, in case someone prefers reading it there
> >>>>>>> https://github.com/kinow/functor.
> >>>>>>>
> >>>>>>> Let me know what you think about it :-)
> >>>>>>>
> >>>>>>> Thank you in advance!
> >>>>>>>
> >>>>>>> Bruno P. Kinoshita
> >>>>>>> http://kinoshita.eti.br
> >>>>>>> http://tupilabs.com
> >>>>>>>
> >>>>>>>
> >>>>>>>
> ---------------------------------------------------------------------
> >>>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >>>>>>> For additional commands, e-mail: dev-h...@commons.apache.org
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> ---------------------------------------------------------------------
> >>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >>>>>> For additional commands, e-mail: dev-h...@commons.apache.org
> >>>>>>
> >>>>>
> >>>>
> >>>> ---------------------------------------------------------------------
> >>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >>>> For additional commands, e-mail: dev-h...@commons.apache.org
> >>>>
> >>>
> >>
> >>---------------------------------------------------------------------
> >>To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >>For additional commands, e-mail: dev-h...@commons.apache.org
> >>
> >>
> >>
> >>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> > For additional commands, e-mail: dev-h...@commons.apache.org
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> For additional commands, e-mail: dev-h...@commons.apache.org
>
>

Reply via email to