Skip to content

Commit 9d0ba90

Browse files
authored
Merge pull request #40 from hg-pyun/version/1.1.0
Version/1.1.0
2 parents 566d195 + 8a9bae7 commit 9d0ba90

19 files changed

+502
-371
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# Created by .ignore support plugin (hsz.mobi)
22
/package-lock.json
33
/node_modules/
4-
/lib/iterize.dev.js
4+
.idea

.npmignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@
88
# Folders
99
/.github/
1010
/node_modules/
11+
.idea

.prettierrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
"trailingComma": "es5",
33
"tabWidth": 4,
44
"semi": true,
5-
"singleQuote": true,
5+
"singleQuote": true
66
}

README.md

Lines changed: 45 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# iterize
22

33
[![npm](https://img.shields.io/npm/v/iterize.svg)](https://www.npmjs.com/package/iterize)
4-
![npm](https://img.shields.io/npm/dm/iterize.svg)
4+
[![npm](https://img.shields.io/npm/dt/iterize.svg)](https://www.npmjs.com/package/iterize)
55
[![GitHub license](https://img.shields.io/github/license/hg-pyun/iterize.svg)](https://github.com/hg-pyun/iterize/blob/master/LICENSE)
66

7-
> Minimalistic JavaScript Iterators
7+
> Use JavaScript Iterator, Easily
88
9-
A great feature called Iterator was added into JavaScript. However, it's a strange concept to most of the front-end developers.
9+
**iterize** is a minimalistic creator for the iterator. A great feature called Iterator was added into JavaScript. However, it's a strange concept for most of the front-end developers.
1010
**iterize** helps you create your code more easily and efficiently using the various attributes of the Iterable Protocol.
1111

1212
## Why Powerful?
@@ -29,46 +29,58 @@ Most functions of **iterize** are implemented as Higher-Order Functions. You can
2929
$ npm install iterize --save
3030
```
3131

32-
# API
33-
3432
You can import **iterize** using ESModule style.
3533

3634
```js
3735
import * as iterize from 'iterize';
3836
```
39-
OR
4037
```js
4138
import {range} from 'iterize';
4239
```
4340

41+
# API
42+
- [Range](https://github.com/hg-pyun/iterize#range)
43+
- [Cycle](https://github.com/hg-pyun/iterize#cycle)
44+
- [Repeat](https://github.com/hg-pyun/iterize#repeat)
45+
- [Replicate](https://github.com/hg-pyun/iterize#replicate)
46+
- [Take](https://github.com/hg-pyun/iterize#take)
47+
4448
## Range
4549

4650
Returns a transmitter that increases with some steps within a certain range.
4751

4852
#### Interface
4953

5054
```typescript
51-
range(start: number, end:number, step: number | Function): Iterator
55+
range(start: number, end?:number, step?: number | Function): Iterator
5256
```
5357

5458
#### Example
55-
59+
You can use with `for-of` syntax.
5660
```js
5761
import {range} from 'iterize';
5862

59-
[...range(1, 10, 1)]; // [1, 2, 3 ... 9]
60-
[...range(1, 10, x => x + 1)]; // [1, 2, 3 ... 9]
61-
[...range(2, 64, x => x * x)]; // [2, 4, 16]
62-
```
63+
for (let number of range(5)) {
64+
console.log(number); // 0, 1, 2, 3, 4
65+
}
6366

64-
```js
65-
import {range} from 'iterize';
67+
for (let number of range(0, 5)) {
68+
console.log(number); // 0, 1, 2, 3, 4
69+
}
6670

67-
let result = [];
68-
for (let number of range(1, 3, 1)) {
69-
result.push(number);
71+
for (let number of range(0, 5, 2)) {
72+
console.log(number); // 0, 2, 4
7073
}
71-
console.log(result); // [1, 2, 3]
74+
```
75+
With the spread operator.
76+
```js
77+
import {range} from 'iterize';
78+
[...range(5)]; // [0, 1, 2, 3, 4]
79+
[...range(0, 5)]; // [0, 1, 2, 3, 4]
80+
[...range(5, 0)]; // [5, 4, 3, 2, 1]
81+
[...range(1, 10, 1)]; // [1, 2, 3 ... 9]
82+
[...range(1, 10, x => x + 1)]; // [1, 2, 3 ... 9]
83+
[...range(2, 64, x => x * x)]; // [2, 4, 16]
7284
```
7385

7486
## Cycle
@@ -95,7 +107,7 @@ iter.next(); // { value: 1, done: false }
95107
iter.next(); // { value: 2, done: false }
96108
...
97109
```
98-
110+
`Cycle` can also receive a range iterator.
99111
```js
100112
import {cycle, range} from 'iterize';
101113

@@ -118,7 +130,7 @@ Returns a number or a string infinitely.
118130
#### Interface
119131

120132
```typescript
121-
repeat(item: number | string): Iterator
133+
repeat(item: number | string| Function): Iterator
122134
```
123135

124136
#### Example
@@ -150,28 +162,24 @@ Returns the N copies of the input(number, string, or iterator).
150162
#### Interface
151163

152164
```typescript
153-
replicate(count: number, item: number | string | Iterator): Iterator
165+
replicate(count: number, item: number | string | Function | Iterator): Iterator
154166
```
155167

156168
#### Example
157-
158169
```js
159170
import {replicate} from 'iterize';
160171

161-
[...replicate(5, 0)] // [0, 0, 0, 0, 0]
162-
[...replicate(5, 'a')] // ['a', 'a', 'a', 'a', 'a']
172+
for (let number of replicate(3, 1)) {
173+
console.log(number); // [1, 1, 1]
174+
}
163175
```
164-
176+
With the spread operator.
165177
```js
166178
import {replicate} from 'iterize';
167179

168-
let result = [];
169-
for (let number of replicate(3, 0)) {
170-
result.push(number);
171-
}
172-
console.log(result); // [0, 0, 0]
180+
[...replicate(5, 0)] // [0, 0, 0, 0, 0]
181+
[...replicate(5, 'a')] // ['a', 'a', 'a', 'a', 'a']
173182
```
174-
175183
```js
176184
import {replicate, range} from 'iterize';
177185

@@ -186,27 +194,24 @@ Returns the first N items of the iterator sequentially.
186194
#### Interface
187195

188196
```typescript
189-
take(count: Number, iter: Iterator): Iterator
197+
take(count: number, iter: Iterator): Iterator
190198
```
191199

192200
#### Example
193-
194201
```js
195202
import {take, cycle} from 'iterize';
196203

197204
const cycleIterator = cycle([1, 2, 3]);
198-
[...take(5, cycleIterator)]; // [1, 2, 3, 1, 2]
205+
for (let number of take(5, cycleIterator)) {
206+
console.log(number); // 1, 2, 3, 1, 2
207+
}
199208
```
200-
209+
With the spread operator.
201210
```js
202211
import {take, cycle} from 'iterize';
203212

204213
const cycleIterator = cycle([1, 2, 3]);
205-
let result = [];
206-
for (let number of take(2, cycleIterator)) {
207-
result.push(number);
208-
}
209-
console.log(result); // [1, 2]
214+
[...take(5, cycleIterator)]; // [1, 2, 3, 1, 2]
210215
```
211216

212217
# CONTRIBUTING

package.json

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "iterize",
3-
"version": "1.0.1",
3+
"version": "1.1.0",
44
"description": "Minimalistic Javascript Iterators",
55
"main": "./lib/index.js",
66
"repository": {
@@ -19,9 +19,13 @@
1919
"generator",
2020
"es6",
2121
"helper",
22+
"iterable",
2223
"iterable protocol",
2324
"lazy evaluation",
24-
"reuse"
25+
"reuse",
26+
"effective",
27+
"productive",
28+
"tool"
2529
],
2630
"devDependencies": {
2731
"@babel/cli": "^7.1.2",
@@ -39,6 +43,7 @@
3943
"husky": "^1.1.2",
4044
"lint-staged": "^7.3.0",
4145
"mocha": "^5.2.0",
46+
"precise-commits": "^1.0.2",
4247
"prettier": "1.14.3",
4348
"ts-node": "^7.0.1",
4449
"typescript": "^3.1.1"
@@ -48,15 +53,9 @@
4853
},
4954
"husky": {
5055
"hooks": {
51-
"pre-commit": "lint-staged"
56+
"pre-commit": "precise-commits"
5257
}
5358
},
54-
"lint-staged": {
55-
"*.{ts,css}": [
56-
"prettier --write",
57-
"git add"
58-
]
59-
},
6059
"scripts": {
6160
"build": "cross-env BABEL_ENV=production babel ./src --out-dir lib --extensions '.ts'",
6261
"test": "mocha --recursive ./test/*.ts --require ts-node/register",

src/commons/ErrorModels.ts

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,15 @@
1-
class EmptyArrayError extends Error {
2-
constructor() {
3-
super('Array is Empty.');
4-
this.name = 'Array Error';
5-
}
6-
}
7-
8-
class InputTypeError extends Error {
9-
constructor() {
10-
super('Input parameter type is wrong.');
11-
this.name = 'InputType Error';
12-
}
13-
}
14-
15-
class IllegalArgumentError extends Error {
1+
class ArgumentError extends Error {
162
constructor(message: string) {
17-
super('Argument is illegal\n' + message);
18-
this.name = 'IllegalArgument Error';
3+
super(message);
4+
this.name = 'Argument Error';
195
}
206
}
217

22-
class IllegalIteratorBehaviorError extends Error {
8+
class BehaviorError extends Error {
239
constructor(message: string) {
24-
super('Behavior of iterator is illegal\n' + message);
25-
this.name = 'IllegalIteratorBehavior Error';
10+
super(message);
11+
this.name = 'IteratorBehavior Error';
2612
}
2713
}
2814

29-
export {
30-
EmptyArrayError,
31-
InputTypeError,
32-
IllegalArgumentError,
33-
IllegalIteratorBehaviorError,
34-
};
15+
export { ArgumentError, BehaviorError };

src/commons/Iterators.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
import { IllegalIteratorBehaviorError } from './ErrorModels';
1+
import { BehaviorError } from './ErrorModels';
22

33
export interface IterableProtocol extends IterableIterator<any> {
44
// this method should clone the initial state of iterator
55
clone(): IterableProtocol;
66
}
77

88
export class PrimitiveIterator implements IterableProtocol {
9-
value: number | string;
9+
value: number | string | Function;
1010
done: boolean = false;
1111

12-
constructor(value: number | string) {
12+
constructor(value: number | string | Function) {
1313
this.value = value;
1414
}
1515

@@ -86,9 +86,7 @@ export class RepeatIterator implements IterableProtocol {
8686
this.iterator = this.iterator.clone();
8787
next = this.iterator.next();
8888
if (next.done) {
89-
throw new IllegalIteratorBehaviorError(
90-
'iterator should iterable more than once'
91-
);
89+
throw new BehaviorError('Iterator should iterable more than once.');
9290
}
9391
this.repeatCount++;
9492
return next;

src/commons/utility.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1-
import { IterableProtocol } from './Iterators';
1+
import {IterableProtocol, RepeatIterator} from './Iterators';
22
function isIterator(value: any): value is IterableProtocol {
33
return value.next !== undefined && value.clone !== undefined;
44
}
55

6-
export { isIterator };
6+
function isRepeatIterator(iterator: IterableProtocol) {
7+
return iterator instanceof RepeatIterator;
8+
}
9+
10+
export { isIterator, isRepeatIterator };

src/cycle.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
1-
import { InputTypeError, EmptyArrayError } from './commons/ErrorModels';
1+
import { ArgumentError } from './commons/ErrorModels';
22
import {
33
IterableProtocol,
44
ArrayIterator,
55
RepeatIterator,
66
} from './commons/Iterators';
7-
import { isIterator } from './commons/utility';
7+
import { isIterator, isRepeatIterator } from './commons/utility';
88

99
function cycle(item: Array<any> | IterableProtocol): IterableProtocol {
10-
if (!Array.isArray(item) && !isIterator(item)) {
11-
throw new InputTypeError();
10+
11+
if (validateInputTypes(item)) {
12+
throw new ArgumentError('Please check arguments type.');
1213
}
14+
15+
// todo refactoring
1316
if (Array.isArray(item) && (item as Array<any>).length === 0) {
14-
throw new EmptyArrayError();
17+
throw new ArgumentError('Array is empty.');
18+
}
19+
else if(isRepeatIterator(item as IterableProtocol)) {
20+
throw new ArgumentError('Do not use infinite type iterator.');
1521
}
1622

1723
let iterator: IterableProtocol;
@@ -24,4 +30,8 @@ function cycle(item: Array<any> | IterableProtocol): IterableProtocol {
2430
return new RepeatIterator(iterator, RepeatIterator.FOREVER);
2531
}
2632

33+
function validateInputTypes(item: any) {
34+
return !Array.isArray(item) && !isIterator(item);
35+
}
36+
2737
export default cycle;

0 commit comments

Comments
 (0)