-
Notifications
You must be signed in to change notification settings - Fork 0
/
a-little-javascript-problem.js
62 lines (56 loc) · 1.29 KB
/
a-little-javascript-problem.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// http://lisperator.net/blog/a-little-javascript-problem/
// Date: 2017.2.18
/**
* foreach('<List> 1 2 3 4', function(n) {
*
* })
*/
function foreach(list, fn) {
let mark = '<List>';
let start = list.indexOf(mark) + mark.length;
if (start < mark.length) throw new Error('Not a list.');
let item = '';
while (start++ < list.length) {
let c = list.charAt(start);
if (!/\s/.test(c)) item += c;
if (start == list.length - 1 || /\s/.test(c) && item.length) {
fn(item);
item = '';
}
}
}
/**
* range(1, 5)
* == '<List> 1 2 3 4 5'
*/
function range(start, end) {
if (arguments.length == 1) [end, start] = [start, 0];
let list = '<List>';
while (start <= end) list += (' ' + start++);
return list;
}
/**
* reverse('<List> 1 2 3 4 5')
* == '<List> 5 4 3 2 1'
*/
function reverse(list) {
let newList = '';
foreach(list, n => (newList = n + ' ' + newList));
return '<List> ' + newList;
}
/**
* map('<List> 1 2 3 4 5', n => n * n)
* == '<List> 1 4 9 16 25'
*/
function map(list, fn) {
let newList = '<List>';
foreach(list, n => (newList += (' ' + fn(n))));
return newList;
}
/**
* Sample code
*/
var numbers = range(1, 10)
numbers = map(numbers, function (n) { return n * n });
numbers = reverse(numbers);
foreach(numbers, console.log);