Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/tiago154/iterators-e-generators
➿ ➰ 🔁 Repositório com intuito de exemplificar e descrever o funcionamento dos `Iterators` e `Generators` em Javascript
https://github.com/tiago154/iterators-e-generators
generator iterator yield
Last synced: 29 days ago
JSON representation
➿ ➰ 🔁 Repositório com intuito de exemplificar e descrever o funcionamento dos `Iterators` e `Generators` em Javascript
- Host: GitHub
- URL: https://github.com/tiago154/iterators-e-generators
- Owner: tiago154
- Created: 2020-08-17T01:01:02.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2020-08-17T23:03:52.000Z (over 4 years ago)
- Last Synced: 2024-12-11T16:24:05.432Z (about 1 month ago)
- Topics: generator, iterator, yield
- Language: JavaScript
- Homepage:
- Size: 2.5 MB
- Stars: 3
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Iterators e Generators
## 📝 Conteúdo
- [Descrição](#descrição)
- [Começando](#começando)
- [Exemplos](#exemplos)Repositório com intuito de exemplificar e descrever o funcionamento dos `Iterators` e `Generators` em Javascript
### Pré-requisitos
- Node 12 or +
### Instalando
Clone o repostório
```bash
git clone [email protected]:tiago154/iterators-e-generators.git
```Instale as dependências
```bash
npm install
```### 🔁 Iterator
Um objeto é um iterator (iterador) quando sabe como acessar itens numa coleção, um por vez, enquanto mantém rastreada a posição atual em uma dada sequência. Em JavaScript um iterator é um objeto que oferece o método next(), o qual retorna o próximo item da sequência. Este método retorna um objeto com duas propriedades: done e value.
[01-iterator.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/01-iterator.js)
Execute o comando:
```bash
npm run 01
```### 🔁 Iterable
Um objeto é iterável (iterable), se ele define seu comportamento de iteração, como no caso de quais valores percorridos em um laço do tipo for..of. Alguns tipos embutidos, como o Array, ou o Map, têm um comportamento iterável padrão, enquanto outros tipos (como Object) não possuem.
Para que um objeto seja iterable, o objeto precisa implemntar o método `@@iterator`, significando que o objeto (ou um dos objetos na cadeia de prototipagem - prototype chain) precisa ter uma propriedade com uma chave `Symbol.iterator`:
[02-iterable.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/02-iterable.js)
Execute o comando:
```bash
npm run 02
```Chamando um iterable implemetado pelo usuário com a função Next()
[03-iterable-call-next.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/03-iterable-call-next.js)
Execute o comando:
```bash
npm run 03
```Alguns objetos no JavaScript por padrão já implementam esse protocolo, como por exemplo:
- String
- Array
- Map
- Set
- arguments (dentro de funções)
- NodeList (no browser)[04-native-iterables.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/04-native-iterables.js)
Execute o comando:
```bash
npm run 04
```### 🔁 Generator
Enquanto os iteradores são ferramentas muito úteis, sua criação requer um cuidado devido a necessidade de manter explícito seu estado interno. Generators provê uma alternativa poderosa: eles te permitem definir um algoritmo iterativo escrevendo uma função simples que pode manter seu estado próprio.
Generator é um tipo especial de função que trabalha como uma factory para iteradores. A função vira um generator se ela contém uma ou mais expressões `yield` e se ela usa a sintaxe `function*`.
Vale observar que não é possível definir um generator utilizando a sintaxe de arrow function, pois o JavaScript só reconhece que uma função define um generator através da declaração `function*`
Note que a execução das chamadas de `yield` são `lazy`, ou seja elas não são computadas todas de uma vez. A cada execução do iterador o estado da função permanece salvo e pode ser acessado nas execuções posteriores.
[05-generator.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/05-generator.js)
Execute o comando:
```bash
npm run 05
```[06-generator-with-params.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/06-generator-with-params.js)
Execute o comando:
```bash
npm run 06
```[07-generator-with-params.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/07-generator-with-params.js)
Execute o comando:
```bash
npm run 07
```### 🔁 Yield*
A expressão `yield*` é usada para delegar para outro objeto `generator` ou `iterable`.
[08-yield-with-asterisk.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/08-yield-with-asterisk.js)
Execute o comando:
```bash
npm run 08
```### 🔁 Desempenho CPU
Generators não são indicados para melhorar o desempenho bruto de CPU, pois outras implementações se sairão melhores
[09-cpu-performance.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/09-cpu-performance.js)
Execute o comando:
```bash
npm run 09
```### 🔁 Desempenho Memória
Mas se voce necessita trabalhar com grandes listas e não impactar a memoria de sua aplicação, um generator pode ser uma opção a ser utilizada.
##### Antes de executar os exemplos a seguir, utilize o comando `npm run generate-mock` e adicione a quantidade desejada de itens em mock na frente do comando.
Exemplo:
```bash
npm run generate-mock 1000000
```No exemplo abaixo, o código irá manipular uma lista, realizar uma transformação de dados com o map e por fim salvar os dados. Podemos ver que o processamento é até rapido, mas o consumo de memória é bem alto.
[10-memory-usage.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/10-memory-usage.js)
Execute o comando:
```bash
npm run 10
```Nesse outro exemplo, é feita a mesma coisa, mas é utilizado um generator, onde a manipulação de dados é feita em pedaços. Dessa forma reduzimos o consumo de memória e não teremos problemas caso a quantidade de elementos da lista aumente.
[11-memory-usage.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/11-memory-usage.js)
Execute o comando:
```bash
npm run 11
```