Skip to content

Commit 3543345

Browse files
committed
Refactored exercise codes to DRY up random input gen code
1 parent 9d803ac commit 3543345

File tree

10 files changed

+78
-60
lines changed

10 files changed

+78
-60
lines changed

exercises/async_loops/exercise.js

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,23 @@
33
var deepEqual = require('deep-eql')
44
var inspect = require('util').inspect
55
var loremIpsum = require('lorem-ipsum')
6+
var random = require('../randomizer')
67
var runner = require('../../runner')
78

8-
function randomInt(min, max) {
9-
return Math.floor((Math.random() * (max - min)) + min)
10-
}
11-
129
// All deepEqual impls (assert, deep-eql…) seem to b0rk when multiple objects
1310
// in an array share the same `id` value (wtf?!), so we make sure they're unique.
14-
var userCount = randomInt(10, 20)
11+
var userCount = random.int(10, 20)
1512
var userIds = []
1613
while (userIds.length < userCount) {
17-
var id = randomInt(0, 1000)
14+
var id = random.int(0, 1000)
1815
if (-1 !== userIds.indexOf(id)) continue
1916
userIds.push(id)
2017
}
2118

22-
var users = Array.apply(null, { length: userCount }).map(function() {
19+
var users = random.arrayOf(userCount, function() {
2320
return {
2421
id: userIds.shift(),
25-
name: loremIpsum().split(' ').slice(0, 2).map(function(word) {
26-
word[0] = word[0].toUpperCase();
27-
return word;
28-
}).join(' ')
22+
name: random.words(2, { capitalized: true })
2923
}
3024
})
3125

@@ -41,7 +35,7 @@ module.exports = runner.custom(function(f) {
4135
var match = users.filter(function(user) {return user.id === id})
4236
if (match.length) fn(match[0])
4337
else fn(null)
44-
}, Math.floor(Math.random() * 1000))
38+
}, random.int(0, 1000))
4539
}
4640
var done = function(submittedUsers) {
4741
clearTimeout(tooLong)

exercises/basic_call/exercise.js

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
"use strict"
22

3+
var random = require('../randomizer')
34
var runner = require('../../runner')
45
var util = require('util')
56

6-
function randomInt(min, max) {
7-
return Math.floor((Math.random() * (max - min)) + min)
8-
}
9-
10-
var input = Array.apply(null, { length: randomInt(0, 20) }).map(function() {
11-
return randomInt(0, 10)
12-
})
7+
var input = random.arrayOfInts(20, 0, 10)
138

149
module.exports = runner.custom(function(fx, numbers) {
1510
var valid = 1

exercises/basic_every_some/exercise.js

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,27 @@
11
"use strict"
22

3-
var loremIpsum = require('lorem-ipsum')
3+
var random = require('../randomizer')
44
var runner = require('../../runner')
55

6-
function randomInt(min, max) {
7-
return Math.floor((Math.random() * (max - min)) + min)
8-
}
9-
106
function makeUser() {
117
return {
12-
id: randomInt(0, 1000),
13-
name: loremIpsum().split(' ').slice(0, 2).map(function(word) {
14-
word[0] = word[0].toUpperCase();
15-
return word;
16-
}).join(' ')
8+
id: random.int(0, 1000),
9+
name: random.words(2, { capitalized: true })
1710
}
1811
}
1912

2013
function makeListOfUsers() {
21-
return Array.apply(null, { length : randomInt(10, 100) }).map(makeUser)
14+
return random.arrayOf(10, 100, makeUser)
2215
}
2316

2417
var good = makeListOfUsers()
2518
var bad = makeListOfUsers()
26-
var lists = Array.apply(null, {length: 20}).map(function() {
27-
return Array.apply(null, {length: 20}).map(function() {
19+
var lists = random.arrayOf(20, function() {
20+
return random.arrayOf(20, function() {
2821
if (Math.random() < 0.95) {
29-
return good[randomInt(0, 10)]
22+
return good[random.int(0, 10)]
3023
} else {
31-
return bad[randomInt(0, 10)]
24+
return bad[random.int(0, 10)]
3225
}
3326
})
3427
})

exercises/basic_filter/exercise.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
"use strict"
22

33
var loremIpsum = require('lorem-ipsum')
4+
var random = require('../randomizer')
45
var runner = require('../../runner')
56

6-
function randomInt(min, max) {
7-
return Math.floor((Math.random() * (max - min)) + min)
8-
}
9-
10-
var input = new Array(randomInt(10, 30)).join(',').split(',')
11-
.map(function() { return { message: loremIpsum() } })
7+
var input = random.arrayOf(10, 30, function() {
8+
return { message: loremIpsum() }
9+
})
1210

1311
module.exports = runner.hideInput(input)

exercises/basic_map/exercise.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
"use strict"
22

3+
var random = require('../randomizer')
34
var runner = require('../../runner')
45

5-
function randomInt(min, max) {
6-
return Math.floor((Math.random() * (max - min)) + min)
7-
}
8-
9-
var input = new Array(randomInt(0, 19)).join(',').split(',')
10-
.map(function() { return randomInt(0, 9) })
6+
var input = random.arrayOfInts(19, 0, 9)
117

128
var regularMap = Array.prototype.map, usedMap
139
Array.prototype.map = function() {
Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
"use strict"
22

3+
var random = require('../randomizer')
34
var runner = require('../../runner')
45

5-
function randomInt(min, max) {
6-
return Math.floor((Math.random() * (max - min)) + min)
7-
}
8-
96
var counter
107

118
module.exports = runner.init(function() {
129
console.log("------------------------")
1310
counter = 0
1411
}).quiet(function count() {
1512
console.log("Called function %d times.", ++counter)
16-
}, randomInt(3, 10))
13+
}, random.int(3, 10))

exercises/partial_application_without_bind/exercise.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
"use strict"
22

33
var loremIpsum = require('lorem-ipsum')
4+
var random = require('../randomizer')
45
var runner = require('../../runner')
56

6-
var input = Array.apply(null, {length: Math.random() * 20 + 1}).map(function() {
7-
return loremIpsum()
8-
})
7+
var input = random.arrayOfLorems(1, 20)
98

109
// FIXME: THIS DOES NOT CAPTURE console.log OUTPUT PROPERLY (as it happens
1110
// inside the runner, not in child processes). WE NEED TO CHANGE THIS INTO

exercises/randomizer.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
"use strict"
2+
3+
var loremIpsum = require('lorem-ipsum')
4+
5+
function randomArrayOf(minCells, maxCells, callback) {
6+
if ('function' === typeof maxCells && 'undefined' === typeof callback) {
7+
callback = maxCells
8+
maxCells = minCells
9+
}
10+
return Array.apply(null, { length: randomInt(minCells, maxCells) }).map(callback)
11+
}
12+
13+
function randomArrayOfInts(maxCells, minInt, maxInt) {
14+
return randomArrayOf(0, maxCells, function() {
15+
return randomInt(minInt, maxInt)
16+
})
17+
}
18+
19+
function randomArrayOfLorems(minCells, maxCells) {
20+
var loremOptions = Array.prototype.slice(arguments, 2)
21+
return randomArrayOf(minCells, maxCells, function() {
22+
return loremIpsum.apply(loremIpsum, loremOptions)
23+
})
24+
}
25+
26+
function randomInt(min, max) {
27+
if (min === max) return max
28+
return Math.floor((Math.random() * (max - min + 1)) + min)
29+
}
30+
31+
function randomWords(count, options) {
32+
options = options || {}
33+
var result = loremIpsum().split(' ').slice(0, count)
34+
if (options.capitalized) {
35+
result = result.map(function(word) {
36+
word[0] = word[0].toUpperCase()
37+
return word
38+
})
39+
}
40+
return result.join(' ')
41+
}
42+
43+
module.exports = {
44+
int: randomInt,
45+
arrayOf: randomArrayOf,
46+
arrayOfInts: randomArrayOfInts,
47+
arrayOfLorems: randomArrayOfLorems,
48+
words: randomWords
49+
}

exercises/recursion/exercise.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
"use strict"
22

3+
var random = require('../randomizer')
34
var runner = require('../../runner')
45

5-
function randomInt(min, max) {
6-
return Math.floor((Math.random() * (max - min)) + min)
7-
}
8-
96
var data = {
107
"name": "functional-javascript-workshop",
118
"version": "0.0.13",
@@ -105,7 +102,7 @@ var data = {
105102
}
106103

107104
function getRandomSubTree() {
108-
return randomInt(0, Object.keys(data.dependencies.workshopper.dependencies).length)
105+
return random.int(0, Object.keys(data.dependencies.workshopper.dependencies).length)
109106
}
110107

111108
var items = [getRandomSubTree(), getRandomSubTree(), getRandomSubTree(), getRandomSubTree()]

exercises/recursion/solution/solution.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
function getDependencies(mod, result) {
22
result = result || []
3-
var dependencies = mod.dependencies || []
3+
var dependencies = mod && mod.dependencies || []
44
Object.keys(dependencies).forEach(function(dep) {
55
var key = dep + '@' + mod.dependencies[dep].version
66
if (result.indexOf(key) === -1) result.push(key)

0 commit comments

Comments
 (0)