Last active
March 18, 2022 08:49
-
-
Save k2works/b21854066b230d3c5f7a1eda4f35091b to your computer and use it in GitHub Desktop.
JavaScriptで学ぶ関数型プログラミング
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var assert = require("assert"); | |
//var _ = require("/Users/kakim/scoop/apps/nvm/current/nodejs/v12.21.0/node_modules/underscore"); | |
//var _ = require("/Users/kakim/scoop/apps/nvm/current/nodejs/v16.3.0/node_modules/underscore"); | |
var _ = require("/usr/local/lib/node_modules/underscore"); | |
var lyrics = []; | |
for (var bottles = 99; bottles > 0; bottles--) { | |
lyrics.push(bottles + " 本のビールが残っている"); | |
lyrics.push(bottles + " 本のビールが"); | |
lyrics.push("ひとつ取って、隣に回せ"); | |
if (bottles > 1) { | |
lyrics.push(bottles - 1 + " 本のビールが残っている"); | |
} else { | |
lyrics.push("もうビールは残っていない"); | |
} | |
} | |
function lyricSegment(n) { | |
return _.chain([]) | |
.push(n + " 本のビールが残っている") | |
.push(n + " 本のビール") | |
.push("ひとつ取って、隣に回せ") | |
.tap(function (lyrics) { | |
if (n > 1) lyrics.push(n - 1 + " 本のビールが残っている"); | |
else lyrics.push("もうビールは残っていない"); | |
}) | |
.value(); | |
} | |
lyricSegment(9); | |
function song(start, end, lyricGen) { | |
return _.reduce( | |
_.range(start, end, -1), | |
function (acc, n) { | |
return acc.concat(lyricGen(n)); | |
}, | |
[] | |
); | |
} | |
song(99, 0, lyricSegment); | |
var nums = [100, 2, 25]; | |
function div(x, y) { | |
return x / y; | |
} | |
assert.equal(_.reduce(nums, div), 2); | |
assert.equal(_.reduceRight(nums, div), 0.125); | |
function allOf(/*1つ以上の関数*/) { | |
return _.reduceRight( | |
arguments, | |
function (truth, f) { | |
return truth && f(); | |
}, | |
true | |
); | |
} | |
function anyOf(/*1つ以上の関数*/) { | |
return _.reduceRight( | |
arguments, | |
function (truth, f) { | |
return truth || f(); | |
}, | |
false | |
); | |
} | |
function T() { | |
return true; | |
} | |
function F() { | |
return false; | |
} | |
assert.equal(allOf(), true); | |
assert.equal(allOf(T, T), true); | |
assert.equal(allOf(T, T, T, T, F), false); | |
assert.equal(anyOf(T, T, F), true); | |
assert.equal(anyOf(F, F, F, F), false); | |
assert.equal(anyOf(), false); | |
let result = _.find(["a", "b", 3, "d"], _.isNumber); | |
assert.equal(result, 3); | |
result = _.reject(["a", "b", 3, "d"], _.isNumber); | |
assert.deepEqual(result, ["a", "b", "d"]); | |
function complemet(pred) { | |
return function () { | |
return !pred.apply(null, arguments); | |
}; | |
} | |
result = _.filter(["a", "b", 3, "d"], complemet(_.isNumber)); | |
assert.deepEqual(result, ["a", "b", "d"]); | |
result = _.all([1, 2, 3, 4], _.isNumber); | |
assert.equal(result, true); | |
result = _.any([1, 2, "c", 4], _.isString); | |
assert.equal(result, true); | |
var people = [ | |
{ name: "Rick", age: 30 }, | |
{ name: "Jaka", age: 24 }, | |
]; | |
result = _.sortBy(people, function (p) { | |
return p.age; | |
}); | |
assert.deepEqual(result, [ | |
{ name: "Jaka", age: 24 }, | |
{ name: "Rick", age: 30 }, | |
]); | |
var albums = [ | |
{ title: "Sabbath Bloody Sabbath", genre: "Metal" }, | |
{ title: "Scientist", genre: "Dub" }, | |
{ title: "Undertow", genre: "Metal" }, | |
]; | |
result = _.groupBy(albums, function (a) { | |
return a.genre; | |
}); | |
assert.deepEqual(result, { | |
Metal: [ | |
{ title: "Sabbath Bloody Sabbath", genre: "Metal" }, | |
{ title: "Undertow", genre: "Metal" }, | |
], | |
Dub: [{ title: "Scientist", genre: "Dub" }], | |
}); | |
result = _.countBy(albums, function (a) { | |
return a.genre; | |
}); | |
assert.deepEqual(result, { Metal: 2, Dub: 1 }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment