deno.land / x / linq@4.0.2 / sample / tutorial.js
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180import Enumerable from '../linq.js'
/////////////////////////////// Simple Lambda Expressions
console.log('# Simple Lambda Expressions\n');
// Anonymous functionEnumerable.range(1, 3).select(function(value, index) { return index + ':' + value }).log().toJoinedString();
// Arrow function syntaxEnumerable.range(1, 3).select((value, index) => index + ':' + value).log().toJoinedString();
// Lambdas can also be passed as stringsEnumerable.range(1, 3).select("(value, index) => index + '/' + value").log().toJoinedString();
// If the number of arguments is one, we can use default iterator variable '$'Enumerable.range(1, 3).select("$*2").log().toJoinedString(); // same as i => i * 2
// "" is a shortcut for "x => x" (identity function)Enumerable.range(4, 7).join(Enumerable.range(8, 5), "", "", (outer, inner) => outer * inner).log().toJoinedString();
///////////////////////////////// Scope of lambda expressions
console.log('\n# Scope of lambda expressions\n');
// lambda expressions cannot access the closure when the string syntax is usedtry { var number = 3; Enumerable.range(1,10).where("$ == number").log().toJoinedString();} catch (e) { console.log("can't find number");}
// use anonymous function to capture variableEnumerable.range(1,10).where(function(i){return i == number}).log().toJoinedString();
/////////////////////////////// Initializing from objects
console.log('\n# Initializing from objects\n');
var object = {foo:"a", "bar":100, "foobar":true};Enumerable.from(object).forEach(function(obj) { console.log(obj.key + ":" + obj.value) });
/////////////////////////////////////// Continue and break when iterating
console.log('\n# Continue and break when iterating\n');
Enumerable.repeat("foo", 10).forEach(function(value, index){ if (index % 2 == 0) return; // continue if (index > 6) return false; // break console.log(index + ":" + value);});
//////////////////////////////////// Grouping and ref/value compare
console.log('\n# Grouping and ref/value compare\n');
// ref compareconsole.log((new Date(2000, 1, 1) == new Date(2000, 1, 1))); // falseconsole.log(({ a: 0} == { a: 0 })); // false
console.log("------");var objects = [ { Date: new Date(2000, 1, 1), Id: 1 }, { Date: new Date(2010, 5, 5), Id: 2 }, { Date: new Date(2000, 1, 1), Id: 3 }]
// ref compare, cannot do groupingEnumerable.from(objects) .groupBy("$.Date", "$.Id", function (key, group) { return { date: key, ids: group.toJoinedString(',')} }) .log("$.date + ':' + $.ids").toJoinedString();
console.log("------");
// use fourth argument to groupBy (compareSelector)Enumerable.from(objects) .groupBy("$.Date", "$.Id", function (key, group) { return { date: key, ids: group.toJoinedString(',')} }, function (key) { return key.toString() }) .log("$.date + ':' + $.ids").toJoinedString();
//////////////////////////////// Regular Expression matches
console.log('\n# Regular Expression matches\n');
// Enumerable.matches return Enumerable<MatchObject>
var input = "abcdefgABzDefabgdg";Enumerable.matches(input, "ab(.)d", "i").forEach(function(match){ for (var prop in match) { console.log(prop + " : " + match[prop]); } console.log("toString() : " + match.toString()); console.log("---");});
///////////////////////////////////// LazyEvaluation and InfinityList
console.log('\n# LazyEvaluation and InfinityList\n');
// first radius of a circle with area over 10000var result = Enumerable.toInfinity(1).where(r => r * r * Math.PI > 10000).first();console.log(result);
//////////////// Dictionary
console.log('\n# Dictionary\n');
// sample classvar cls = function (a, b){ this.a = a; this.b = b;}var instanceA = new cls("a", 100);var instanceB = new cls("b", 2000);
// create blank dictionaryvar dict = Enumerable.empty().toDictionary();// create blank dictionary (using compareSelector)var dict = Enumerable.empty().toDictionary("","",function (x) { return x.a + x.b });
dict.add(instanceA, "zzz");dict.add(instanceB, "huga");console.log(dict.get(instanceA)); // zzzconsole.log(dict.get(instanceB)); // huga
// enumerable (to keyvaluePair)dict.toEnumerable().forEach(function (kvp){ console.log(kvp.key.a + ":" + kvp.value);});
/////////////////////////////// Nondeterministic Programs
console.log('\n# Nondeterministic programs\n');
// a puzzle from Structure and Interpretation of Computer Programs// http://sarabander.github.io/sicp/html/4_002e3.xhtml
var apart = Enumerable.range(1, 5);var answers = apart .selectMany(function(baker){ return apart .selectMany(function(cooper){ return apart .selectMany(function(fletcher){ return apart .selectMany(function(miller){ return apart .select(function(smith){ return { baker: baker, cooper: cooper, fletcher: fletcher, miller: miller, smith: smith}})})})})}) .where(function(x){ return Enumerable.from(x).distinct("$.value").count() == 5 }) .where("$.baker != 5") .where("$.cooper != 1") .where("$.fletcher != 1 && $.fletcher != 5") .where("$.miller > $.cooper") .where("Math.abs($.smith - $.fletcher) != 1") .where("Math.abs($.fletcher - $.cooper) != 1");
answers.selectMany("").log("$.key + ':' + $.value").toJoinedString();
Version Info