1
\$\begingroup\$

Create a function that takes in a generator function as its only parameter, and returns an object that can be used as both as a generator and a generator function for said generator. The idea is to be able to create an object that behaves like a generator (that is, it follows the iteration protocols) but also has the ability to restart itself.

For the rules:

  • SelfGenerator is the function you're creating.

  • sg is the return value of SelfGenerator.

  • genFunc is the parameter passed into SelfGenerator.

Rules:

  • sg must have a start method that returns a generator that behaves the same as the generator that would be returned by genFunc.

  • sg.start must accept parameters that will be used to create the generator it returns such that it is the same as the generator returned by passing those parameters into genFunc.

  • After sg.start(...params) has been executed, if genFunc(...params)[prop] is callable, then sg[prop] is also callable and will return the same value.

  • sg.start(...params).next(value); let a = sg.next(); and sg.start(...params); sg.next(value); let a = sg.next(); must end up with the same value for a.

  • smallest source code wins

Example:

let sg = SelfGenerator(function*(n) {
    yield n;
    yield n + 1;
    yield n + 2;
});

sg.start(1);         // Generator
sg.next();           // {value: 1, done: false}
sg.next();           // {value: 2, done: false}
sg.start(10).next(); // {value: 10, done: false}
sg.next();           // {value: 11, done: false}
\$\endgroup\$

closed as unclear what you're asking by Xcali, Jo King, manatwork, mbomb007, Peter Taylor Aug 10 at 8:21

Please clarify your specific problem or add additional details to highlight exactly what you need. As it's currently written, it’s hard to tell exactly what you're asking. See the How to Ask page for help clarifying this question. If this question can be reworded to fit the rules in the help center, please edit the question.

  • \$\begingroup\$ Welcome to the site! You have tagged this code-golf and javascript but you have not mentioned either of those things in the body of the question. Is it meant to be code-golf? Is this meant to be Javascript only? Your question is also lacking on expectations for answers. The sentence at the top is a good start and the test cases are helpful but this really needs a thorough explanation of what makes an answer valid or invalid. \$\endgroup\$ – Sriotchilism O'Zaic Aug 8 at 20:42
  • 1
    \$\begingroup\$ @SriotchilismO'Zaic Well I have no idea how this challenge would apply to other languages. I did it in JavaScript because accomplishing this in JavaScript specifically was a fun challenge and required decent knowledge of how js object behave. \$\endgroup\$ – Mason Aug 8 at 20:49
  • 1
    \$\begingroup\$ @SriotchilismO'Zaic I would say that it's perfectly justified to place such a restriction here. Many languages don't even have a concept of functions, much less generators and objects, and trying to phrase this in a language-agnostic way would be next to impossible. \$\endgroup\$ – Esolanging Fruit Aug 8 at 23:50
  • 1
    \$\begingroup\$ What does sg must also behave as a superset of the generator returned by sg.start mean? Is this statement covered by the testcase? \$\endgroup\$ – tsh Aug 9 at 1:45
  • 1
    \$\begingroup\$ It's not clear to me how multiple invocations should behave: a generator function should allow the creation of independent generators, but what if the wrapped generator has side-effects? \$\endgroup\$ – Peter Taylor Aug 10 at 8:25

Browse other questions tagged or ask your own question.