Combining Generators
Learn how to use yield* to combine generators and iterate over other iterable objects.
We'll cover the following...
In the CardDeck
class given in the below code widget, we have two generators:
- One to create the
suits
- The other for
pips
It would be a shame if we have to duplicate the code to create a series that contains both suits
and pips
. Thankfully, we don’t have to endure such pain—JavaScript provides a way to combine generators.
Delegating to already created generator
Let’s create a method, suitsAndPips()
, in the CardDeck
class.
Press + to interact
'use strict';class CardDeck {constructor() {this.suitShapes = ['Clubs', 'Diamonds', 'Hearts', 'Spaces'];}//START:METHOD*suits() {for(const color of this.suitShapes) {yield color;}}//END:METHOD//START:PIPS*pips() {yield 'Ace';yield 'King';yield 'Queen';yield 'Jack';for(let i = 10; i > 1; i--) {yield i.toString();}}//END:PIPS//START:SUITSANDPIPS*suitsAndPips() {yield* this.suits();yield* this.pips();}//END:SUITSANDPIPS}//START:USEconst deck = new CardDeck();//END:USE//START:USESUITSANDPIPSfor(const value of deck.suitsAndPips()) {process.stdout.write(value + ' ');}//END:USESUITSANDPIPSconsole.log();
In the suitsAndPips()
...