Demo source
<html> <head> <title>Express function for Polymer</title> <base href="https://cdn.rawgit.com/download/polymer-cdn/2.0.2/lib/"> <link rel="import" href="polymer/polymer.html" /> </head> <body> <h1>Expression</h1> <expressed-content count="15"></expressed-content> <dom-module id="expressed-content"> <template> <template is="dom-repeat" items="[[sequences]]" as="item"> <!-- This means: --> <!-- 1. sqrt(item) as $result --> <!-- 2. printText($result, item) as output --> <div>[[express(item, sqrt, printText, item)]]</div> </template> </template> <script> 'use strict'; class ExpressedContent extends Polymer.Element { static get is() { return 'expressed-content'; } static get properties() { return { count: { type: Number, value: 10, observer: '_countChanged' }, sequences: { type: Array } } } _countChanged(n, o) { n = Math.max(0, n * 1); let sequences = []; for (let i = 0; i < n; i++) { sequences.push(i + 1); } this.sequences = sequences; } /** * An express function instead of expression */ express() { let args = [...arguments]; // first argument should be first parameter let params = [args.shift()]; // second argument should be a function let fn = args.shift(); // arguments before next function will be additional parameters while (args[0] && typeof (args[0]) !== 'function') { params.push(args.shift()); } // execute and receive result let nextMainParam = fn.call(this, ...params); // continue express when args is not empty return args.length === 0 ? nextMainParam : this.express(nextMainParam, ...args); } sqrt(n) { return n * n; } printText(n1, n2) { return `${n2} x ${n2} = ${n1}`; } } customElements.define(ExpressedContent.is, ExpressedContent); </script> </dom-module> </body> </html>