UNPKG

@7urtle/lambda

Version:

Functional programming library in JavaScript.

278 lines (265 loc) 8.25 kB
import {minusOneToUndefined} from './utils.js'; import {nary} from "./arity.js"; /** * trim output is a string without white characters around it. * * @HindleyMilner trim :: string -> string * * @pure * @param {string} string * @return {string} * * @example * import {trim} from '@7urtle/lambda'; * * trim(' a \n '); // => 'a' */ export const trim = string => string.trim(); /** * testRegEx outputs true if string b passes regular expression a. * * testRegEx can be called both as a curried unary function or as a standard binary function. * * @HindleyMilner testRegEx :: regex -> string -> boolean * * @pure * @param {regex} regex * @param {string} string * @return {boolean} * * @example * import {testRegEx} from '@7urtle/lambda'; * * testRegEx(/[a-z]/)('7urtle'); // => true * testRegEx(/[0-9]/)('1'); // => true * testRegEx(/[0-9]/)('abc'); // => false * * // testRegEx can be called both as a curried unary function or as a standard binary function * testRegEx(/[a-z]/)('7urtle') === testRegEx(/[a-z]/, '7urtle'); */ export const testRegEx = nary(regex => string => regex.test(string)); /** * substr outputs substring based on provided string, start and limit. * * substr can be called both as a curried unary function or as a standard ternary function. * * @HindleyMilner substr :: number -> number -> string -> string * * @pure * @param {number} limit * @param {number} start * @param {string} string * @return {string} * * @example * import {substr} from '@7urtle/lambda'; * * substr(3)(1)('7urtle'); // => 'urt' * substr(1)(0)('7urtle'); // => '7' * substr(1)(-1)('7urtle'); // => 'e' * * // substr can be called both as a curried unary function or as a standard ternary function * substr(3)(1)('7urtle') === substr(3, 1, '7urtle'); */ export const substr = nary(limit => start => string => string.substr(start, limit)); /** * firstLetterOf outputs the first letter of a provided string. * * @HindleyMilner firstLetterOf :: string -> string * * @pure * @param {string} string * @return {string} * * @example * import {firstLetterOf} from '@7urtle/lambda'; * * firstLetterOf('7urtle'); // => '7' */ export const firstLetterOf = string => string.substr(0, 1); /** * lastLetterOf outputs the last letter of a provided string. * * @HindleyMilner lastLetterOf :: string -> string * * @pure * @param {string} string * @return {string} * * @example * import {lastLetterOf} from '@7urtle/lambda'; * * lastLetterOf('7urtle'); // => 'e' */ export const lastLetterOf = string => string.substr(-1, 1); /** * startsWith outputs true if an input string starts with provided string. * * startsWith can be called both as a curried unary function or as a standard binary function. * * @HindleyMilner startsWith :: string -> string -> boolean * * @pure * @param {string} substring * @param {string} string * @return {boolean} * * @example * import {startsWith} from '@7urtle/lambda'; * * startsWith('7')('7urtle'); // => true * startsWith('7urtl')('7urtle'); // => true * startsWith('8urtl')('7urtle'); // => false * * // startsWith can be called both as a curried unary function or as a standard binary function * startsWith('7')('7urtle') === startsWith('7', '7urtle'); */ export const startsWith = nary(substring => string => string.startsWith(substring)); /** * endsWith outputs true if an input string ends with provided string. * * endsWith can be called both as a curried unary function or as a standard binary function. * * @HindleyMilner endsWith :: string -> string -> boolean * * @pure * @param {string} substring * @param {string} string * @return {boolean} * * @example * import {endsWith} from '@7urtle/lambda'; * * endsWith('7e')('7urtle'); // => true * endsWith('urtle')('7urtle'); // => true * endsWith('urtls')('7urtle'); // => false * * // endsWith can be called both as a curried unary function or as a standard binary function * endsWith('e')('7urtle') === endsWith('e', '7urtle'); */ export const endsWith = nary(substring => string => string.endsWith(substring)); /** * repeat outputs new string repeating input string inputted count of times. * * repeat can be called both as a curried unary function or as a standard binary function. * * @HindleyMilner repeat :: number -> string -> string * * @pure * @param {number} count * @param {string} string * @return {string} * * @example * import {repeat} from '@7urtle/lambda'; * * repeat(2)('7urtle'); // => '7urtle7urtle' * repeat(0)('7urtle'); // => '' * * // repeat can be called both as a curried unary function or as a standard binary function * repeat(2)('7urtle') === repeat(2, '7urtle'); */ export const repeat = nary(count => string => string.repeat(count)); /** * replace outputs new string replacing input substring with input replacement string in input string. * * replace can be called both as a curried unary function or as a standard ternary function. * * @HindleyMilner replace :: string -> string -> string -> string * * @pure * @param {string} replacement * @param {string} substring * @param {string} string * @return {string} * * @example * import {replace} from '@7urtle/lambda'; * * replace('8')('7')('7urtle'); // => '8urtle' * replace('7')('')('7urtle'); // => '77urtle' * replace('')('7')('7urtle'); // => 'urtle' * * // replace can be called both as a curried unary function or as a standard ternary function * replace('8')('7')('7urtle') === replace('8', '7', '7urtle'); */ export const replace = nary(replacement => substring => string => string.replace(substring, replacement)); /** * search outputs position of input substring or regular expression withing input string or undefined if it is not found. * * search can be called both as a curried unary function or as a standard binary function. * * @HindleyMilner search :: string/regex -> string -> number * * @pure * @param {string|regex} substring * @param {string} string * @return {number} * * @example * import {search} from '@7urtle/lambda'; * * search('7')('7urtle'); 0 * search('e')('7urtle'); // => 5 * search('rt')('7urtle'); // => 2 * search(/URT/i)('7urtle'); // => 1 * search('8')('7urtle'); => undefined * * // search can be called both as a curried unary function or as a standard binary function * search('7')('7urtle') === search('7', '7urtle'); */ export const search = nary(substring => string => minusOneToUndefined(string.search(substring))); /** * split outputs and array of an input string split by the input substring. * * split can be called both as a curried unary function or as a standard binary function. * * @HindleyMilner split :: string -> string -> array * * @pure * @param {string} substring * @param {string} string * @return {array} * * @example * import {split} from '@7urtle/lambda'; * * split(' ')('7urtles are awesome'); // => ['7urtles', 'are', 'awesome'] * split('/')('7urtles are awesome'); // => ['7urtles are awesome'] * * // split can be called both as a curried unary function or as a standard binary function * split(' ')('7urtles are awesome') === split(' ', '7urtles are awesome'); */ export const split = nary(substring => string => string.split(substring)); /** * lowerCaseOf outputs the lower case version of input string. * * @HindleyMilner lowerCaseOf :: string -> string * * @pure * @param {string} string * @return {string} * * @example * import {lowerCaseOf} from '@7urtle/lambda'; * * lowerCaseOf('PeTrA'); // => 'petra' * lowerCaseOf('PŘÍŠERNĚ ŽLUŤOUČKÝ KŮŇ ÚPĚL ĎÁBELSKÉ ÓDY'); // => 'příšerně žluťoučký kůň úpěl ďábelské ódy' */ export const lowerCaseOf = string => string.toLowerCase(); /** * upperCaseOf outputs the upper case version of input string. * * @HindleyMilner upperCaseOf :: string -> string * * @pure * @param {string} string * @return {string} * * @example * import {upperCaseOf} from '@7urtle/lambda'; * * upperCaseOf('PeTrA'); // => 'PETRA' * upperCaseOf('příšerně žluťoučký kůň úpěl ďábelské ódy'); // => 'PŘÍŠERNĚ ŽLUŤOUČKÝ KŮŇ ÚPĚL ĎÁBELSKÉ ÓDY' */ export const upperCaseOf = string => string.toUpperCase();