jeremeamia / iter8

PHP library for iterable/generator transformations and operations
MIT License
49 stars 0 forks source link

Curried versions? #3

Open GrahamCampbell opened 5 years ago

GrahamCampbell commented 5 years ago

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))

jeremeamia commented 5 years ago

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.

GrahamCampbell commented 5 years ago

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

GrahamCampbell commented 5 years ago

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