Currying code

Demonstration code for my Dev.To post on currying.

by Tracy-Gregory Gilmore

HTML

<h1>
  Currying
</h1>
<h2>
  Partial-application - part two
</h2>
<h2>
  Results of the code examples for the <a href="https://dev.to/tracygjg/curried-functions-going-functional-one-step-at-a-time-4746">Dev.to article</a>.
</h2>
<main id="mainContainer">
</main>
<h1>
  <i>That's all folkes!!</i>
</h1>

CSS

table {
  border-collapse: collapse;
  margin: 1em;
}

th, td {
  padding: 0.5em 1em;
}

JavaScript

const testData = [
  {name: 'Alice', age: 31},
  {name: 'Bob', age: 32},
  {name: 'Charlie', age: 33},
  {name: 'David', age: 34},
  {name: 'Eve', age: 35},
  {name: 'Fred', age: 36}
];
consoleTable('Test Data', testData);

// mk1a
{
	consoleMessage('Mk1a - Long-form filterConstuctor function');
	{
		const filterContains = filterConstuctor((prop, searchTerm) =>
			prop.includes(searchTerm)
		);

		const nameContains = filterContains('name'); // prop

		const nameContainsTheSearchTerm = nameContains('e');

		const results = testData.filter(nameContainsTheSearchTerm);
    
		consoleTable('Names containg "e"', results);
	}

	{
		const filterGreaterThan = filterConstuctor(
			(prop, searchAge) => prop > searchAge
		);

		const filterGreaterThanAge = filterGreaterThan('age');

		const greaterThan32 = filterGreaterThanAge(32);

		const results = testData.filter(greaterThan32);
		consoleTable('People over 32 years of age', results);
	}

	function filterConstuctor(compareFn) {
		return function getProperty(prop) {
			return function getSearchTerm(searchTerm) {
				return item => compareFn(item[prop], searchTerm);
			};
		};
	}
}

// mk1b
{
	consoleMessage('Mk1b - Short-form filterConstuctor function');
	{
		const filterContains = filterConstuctor((prop, searchTerm) =>
			prop.includes(searchTerm)
		);

		const nameContains = filterContains('name'); // prop

		const nameContainsTheSearchTerm = nameContains('e');

		const results = testData.filter(nameContainsTheSearchTerm);

		consoleTable('Names containg "e"', results);
	}

	{
		const filterGreaterThan = filterConstuctor(
			(prop, searchAge) => prop > searchAge
		);

		const filterGreaterThanAge = filterGreaterThan('age');

		const greaterThan32 = filterGreaterThanAge(32);

		const results = testData.filter(greaterThan32);
		consoleTable('People over 32 years of age', results);
	}

	function filterConstuctor(compareFn) {
		return prop => searchTerm => item => compareFn(item[prop], searchTerm);
	}
}

//...