-
Notifications
You must be signed in to change notification settings - Fork 1
/
curryExercise.js
109 lines (82 loc) · 2.54 KB
/
curryExercise.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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
'use strong';
const _ = require('ramda');
/*****************************************
C U R R Y I N G E X A M P L E
******************************************/
// We've got a nice multiply function.
// It takes two arguments.
console.log( _.multiply(3, 4) );
// But it has been secretly curried already
// so we can feed it fewer arguments and it
// will return a new function.
//
// How about making a function to double a
// value? Done.
const double = _.multiply(2);
console.log( double(13) );
/*****************************************
Y O U R T U R N
******************************************/
// _.split pulls a string apart around a
// given value
console.log( _.split('i', 'mississippi') );
// -- Challenge 1 ------------------------
// Make a function called "words" which
// returns a list of words in a string.
// Use only the split function and
// currying.
console.log("Testing challenge 1...");
//const words = undefined; // change this
//const words = _.curry(function (what, str) {
// return String.prototype.split.apply(str, [what]);
//})(' ');
const words = _.split(' ');
assertEqualArrays(
['one', 'two', 'three'],
words('one two three')
);
console.log("passed");
// -- Challenge 2 ------------------------
// Create a function to triple every
// number in a list using only
// _.multiply and _.map.
console.log("Testing challenge 2...");
const tripleList = _.map(_.multiply(3));
assertEqualArrays([3,6,9], tripleList([1,2,3]));
console.log("passed");
// -- Challenge 3 ------------------------
// Create a function to find the largest
// number in a list. You can use the
// greater(a,b) function which returns the
// greater of its two inputs. You can do
// this with currying and one of the list
// functions _.map, _.filter, or _.reduce.
console.log("Testing challenge 3...");
const greater = function(a,b) {
return a > b ? a : b;
};
//const max = (arr) => {
// return arr.reduce(function (prev, curr) {
// return greater(prev, curr);
// });
//};
const max = _.reduce(greater, -Infinity);
assertEqual(9, max([1,-3483,9,7,2]));
assertEqual(-1, max([-21,-3483,-2,-1]));
console.log("passed");
console.log("All tests pass.");
/******************************************
B A C K G R O U N D C O D E
*******************************************/
function assertEqualArrays(x,y) {
if(x.length !== y.length) throw("expected "+x+" to equal "+y);
for (let i of x) {
//for(var i in x) {
if(x[i] !== y[i]) {
throw("expected array "+x+" to equal "+y);
}
}
}
function assertEqual(x,y){
if(x !== y) throw("expected "+x+" to equal "+y);
}