Skip to content

Instantly share code, notes, and snippets.

@dracon
Forked from BretCameron/fp.js
Created January 17, 2020 07:04
Show Gist options
  • Save dracon/4c14b957a028ec1f0550e30fc62349e8 to your computer and use it in GitHub Desktop.
Save dracon/4c14b957a028ec1f0550e30fc62349e8 to your computer and use it in GitHub Desktop.

Revisions

  1. @BretCameron BretCameron created this gist Oct 14, 2019.
    90 changes: 90 additions & 0 deletions fp.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,90 @@
    /**
    * Performs right-to-left composition, combining multiple functions into a single function.
    * @function compose
    * @param {...Function} args
    * @returns {Function}
    */
    const compose = (...fns) => x => fns.reduceRight((output, fn) => fn(output), x, fns);

    /**
    * Performs left-to-right composition, combining multiple functions into a single function. Sometimes called `sequence`. Right-to-left composition is typically known as `compose`.
    * @function pipe
    * @param {...Function} args
    * @returns {Function}
    */
    const pipe = (...fns) => x => fns.reduce((output, fn) => fn(output), x);

    /** Runs the given function with the supplied object, then returns the object.
    * @function tap
    * @param {Function} f
    * @returns {*}
    */
    const tap = f => x => {
    f(x);
    return x;
    };

    /** Logs the given label and a provided object to the console, the returns the object.
    * @function trace
    * @param {String} label
    * @returns {Function}
    */
    const trace = label => tap(console.log.bind(console, label + ':' || ''));

    /**
    * Divides a number by 100.
    * @function divideBy100
    * @param {Number} num
    * @returns {Number}
    */
    const divideBy100 = num => num / 100;

    /**
    * Returns a number to 2 decimal places.
    * @function roundTo2dp
    * @param {Number} num
    * @returns {String}
    */
    const roundTo2dp = num => num.toFixed(2);

    /**
    * Adds a dollar sign in front of a number or string.
    * @function addDollarSign
    * @param {Number|String} str
    * @returns {String}
    */
    const addDollarSign = str => '$' + String(str);

    /**
    * Add commas every three digits.
    * @function addSeparators
    * @param {Number|String} str
    * @returns {String}
    */
    const addSeparators = str => {
    // Insert commas before the decimal point
    str = str.replace(/(?<!\.\d+)\B(?=(\d{3})+\b)/g, `,`);
    // Insert commas after the decimal point
    str = str.replace(/(?<=\.(\d{3})+)\B/g, `,`);
    return str;
    }

    /**
    * Convert cents to dollars.
    * @function centsToDollars
    * @param {Number} num - The value in cents.
    * @returns {String} - The value in dollars, with a currency symbol and separators.
    */
    const centsToDollars = compose(
    trace('addSeparators'),
    addSeparators,
    trace('addDollarSign'),
    addDollarSign,
    trace('roundTo2dp'),
    roundTo2dp,
    trace('divideBy100'),
    divideBy100,
    trace('argument'),
    );

    centsToDollars(100000000);