iter8 icon indicating copy to clipboard operation
iter8 copied to clipboard

Curried versions?

Open GrahamCampbell opened this issue 5 years ago • 3 comments

Neat little package. After a skim of the examples, I immediately thought that currying would be neat. Like:

BEFORE:

$iter = Iter::pipe(Gen::from(PEOPLE), [
    Pipe::pluck('age'),
    Pipe::reduce('max'),
    Pipe::switch(function (int $maxAge) {
        return Gen::range(1, $maxAge);
    }),
]);

AFTER:

$iter = Iter::pipe(Gen::from(PEOPLE), [
    Pipe::pluck('age'),
    Pipe::reduce('max'),
    Pipe::switch(Gen::range(1)),
]);

The only problem with this is that it's not possible to encode optional params. Perhaps explicitly have two methods, and take the step first?

Pipe::switch(Gen::rangeWithStep(3)(1))

GrahamCampbell avatar Jul 19 '19 23:07 GrahamCampbell

Short closures would be nice here: Pipe::switch(fn(int $maxAge) => Gen::range(1, $maxAge)) Maybe next year. :-)

I have a partial function application function that could work: Pipe::switch(Func::apply([Gen::class, 'range'], 1)) Still not the smoothest, but no function definition.

Not sure how often currying would be needed with range() though. It wasn't the most practical of examples.

jeremeamia avatar Jul 20 '19 01:07 jeremeamia

Hmmm. I guess I was looking for a way to have the nicest possible syntax.

GrahamCampbell avatar Jul 20 '19 10:07 GrahamCampbell

What about if the default was curried, and there was a mechanism to uncurry?

GrahamCampbell avatar Jul 20 '19 10:07 GrahamCampbell