Hello, Benedikt!  I had the same concern about "Interruptible", TBH.
Thanks for weighing in.  As I mentioned earlier, I am thinking of
PredicatedGenerator at this point.

Matt


On Mon, Jan 28, 2013 at 2:30 PM, Benedikt Ritter <benerit...@gmail.com>wrote:

>
>
> Am 28.01.2013 um 21:12 schrieb Matt Benson <gudnabr...@gmail.com>:
>
> > On Mon, Jan 28, 2013 at 10:18 AM, Bruno P. Kinoshita <ki...@apache.org
> >wrote:
> >
> >> Hi Matt
> >>
> >>> As for the modularization, I went ahead and did this in the trunk.  On
> >>> the overall I think Bruno's work is proceeding in a good direction, so
> I
> >>> agree that it should be merged back to trunk when ready.
> >>
> >> Thanks! I'll sync the repos here at office in the next hours. Regarding
> >> the other refactorings.
> >>
> >>> - LoopingGenerator's wrapping constructor should only accept other
> looping
> >>> generators; otherwise, the objects will do things users probably don't
> >>> expect.
> >>
> >> +1 it makes sense indeed
> >
> > I've actually realized now that it should not be necessary for the
> > generator wrapped by one of these to implement
> > whatever-the-name-of-the-abstract-class is.  I am now thinking
> > PredicatedGenerator with a Behavior enum { TEST_BEFORE, TEST_AFTER }.
> >
> > Matt
> >
> >
> >>
> >>> - LoopingGenerator should be renamed to something that relates to its
> >>> "stoppable" quality. StoppableGenerator?  InterruptibleGenerator?
> >>
> >> I first named it StoppableGenerator, then changed to LoopGenerator since
> >> it was being used in classes that reproduced while, dowhile, until, etc.
> >>
> >> StoppableGenerator makes it very clear the "stoppable" behaviour of the
> >> generators, but I'm okay with any name. My main concern was having the
> >> stop() method in the Generator interface :)
>
> Hi,
>
> without knowing the code base in detail I would not recommend calling it
> an InterruptibleGenerator, because this could cause confusion with java's
> thread interruption features.
>
> Benedikt
>
> >>
> >>> - Several of the generator implementations, e.g. UntilGenerate, don't
> seem
> >>> to behave consistently with their description.
> >>
> >> I'll take a look on the generators again, but I remember it took me some
> >> time to get used to the Until, DoWhile, UntilGenerate and other
> generators.
> >>
> >>> - I still feel Range should be decoupled from Generator.  I think it
> would
> >>> be better to join a Range<T> with a UnaryFunction<T, T> to create the
> step
> >>> needed to go from Range to Generator.  This would be more flexible
> than a
> >>> simple addition-based step anyway.
> >>
> >> +1 sounds great Matt. IIUC, this way if I wanted something like a
> >> PrimeNumberGenerator, I could pass a PrimeNumberFunction. FWIW, there
> is a
> >> Range in the lambda project too, probably it is worth taking a look on
> >> their API too.
> >>
> >> Thanks!
> >>
> >> Bruno P. Kinoshita
> >> http://kinoshita.eti.br
> >> http://tupilabs.com
> >>
> >>
> >>> ________________________________
> >>> From: Matt Benson <gudnabr...@gmail.com>
> >>> To: Simone Tripodi <simonetrip...@apache.org>
> >>> Cc: Commons Developers List <dev@commons.apache.org>
> >>> Sent: Monday, January 28, 2013 2:00 PM
> >>> Subject: Re: [functor] Patch for FUNCTOR-14, new Generators and Ranges
> >>>
> >>> Hi Simo,
> >>> As for the modularization, I went ahead and did this in the trunk.  On
> >>> the overall I think Bruno's work is proceeding in a good direction, so
> I
> >>> agree that it should be merged back to trunk when ready.  I have some
> more
> >>> refactorings i am interested to try out on this, or another, branch.
> >> These
> >>> are all, of course, my opinion:
> >>>
> >>> - LoopingGenerator's wrapping constructor should only accept other
> looping
> >>> generators; otherwise, the objects will do things users probably don't
> >>> expect.
> >>> - LoopingGenerator should be renamed to something that relates to its
> >>> "stoppable" quality. StoppableGenerator?  InterruptibleGenerator?
> >>> - Several of the generator implementations, e.g. UntilGenerate, don't
> seem
> >>> to behave consistently with their description.
> >>> - I still feel Range should be decoupled from Generator.  I think it
> would
> >>> be better to join a Range<T> with a UnaryFunction<T, T> to create the
> step
> >>> needed to go from Range to Generator.  This would be more flexible
> than a
> >>> simple addition-based step anyway.
> >>>
> >>> Does anyone object to any of these changes?
> >>>
> >>> Matt
> >>>
> >>>
> >>> On Mon, Jan 28, 2013 at 2:46 AM, Simone Tripodi <
> simonetrip...@apache.org
> >>> wrote:
> >>>
> >>>> Hi Matt,
> >>>>
> >>>> I had a quick look at your branch and I honestly think it is a very
> >>>> good work, maybe we could insert even more modules granularization,
> >>>> but IMHO it worths to merge it in the main branch.
> >>>> Do you see any blocker?
> >>>>
> >>>> Best and thanks!
> >>>> -Simo
> >>>>
> >>>> http://people.apache.org/~simonetripodi/
> >>>> http://simonetripodi.livejournal.com/
> >>>> http://twitter.com/simonetripodi
> >>>> http://www.99soft.org/
> >>>>
> >>>>
> >>>> On Sun, Jan 27, 2013 at 6:39 PM, Matt Benson <gudnabr...@gmail.com>
> >> wrote:
> >>>>> 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
> >>>>>>>>>> *ha
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> For additional commands, e-mail: dev-h...@commons.apache.org
>
>

Reply via email to