pointless-js
Version:
Functional point-free utilities for js
84 lines (66 loc) • 3.42 kB
text/typescript
import { createSafeOperation } from './generic';
import { GetFKeys, GetF } from './type';
export const safeStr = createSafeOperation<string>('');
/**
* Lazifies any String.prototype method - makes it lazy and composable.
*
* @param methodName - the name of the method to uncurry
* @returns a new lazy pure function
*/
function lazyStrMethod<M extends GetFKeys<String>>(methodName: M) {
const method: Function = String.prototype[methodName];
return (...args: Parameters<GetF<String, M>>) => safeStr(
(s): ReturnType<GetF<String, M>> => method.apply(s, args)
);
}
/**
* Lazily matches a pattern that supports being matched against,
* and returns function that returns an array containing the results of that search.
* @param matcher An object that supports being matched against
* @returns a function that performs the given match on a string argument
*/
export const match = (pattern: RegExp) => safeStr(s => s.match(pattern) || []);
/**
* Finds the first substring match in a regular expression search.
* @param pattern The regular expression pattern and applicable flags.
*/
export const search = (pattern: string | RegExp) => safeStr(s => s.search(pattern));
/**
* Lazily returns a check function that indicates
* whether or not a pattern exists in a searched string.
*
* @param matcher An object that supports being matched against
* @returns a function that performs the given test on a string argument
*/
export const test = (pattern: RegExp) => safeStr(s => pattern.test(s));
export const replace: {
(match: RegExp | string, replace: string): (s: string) => string;
(match: RegExp | string, replacer: (substring: string, ...args: any[]) => string): (s: string) => string;
} = lazyStrMethod('replace') as any;
export const prepend = (prefix: string) => safeStr(s => prefix.concat(s));
/**
* Returns a string that contains the concatenation of two or more strings.
* @param args The strings to append to the end of the string.
*/
export const append = lazyStrMethod('concat');
/**
* Lazily split a string into substrings using the specified separator and return them as an array.
* @param separator A string that identifies character or characters to use in separating the string. If omitted, a single-element array containing the entire string is returned.
* @param limit A value used to limit the number of elements returned in the array.
*/
export const split = (separator: string | RegExp, limit?: number) => safeStr(s => s.split(separator, limit));
/**
* Gets a substring beginning at the specified location and having the specified length.
* @param from The starting position of the desired substring. The index of the first character in the string is zero.
* @param length The number of characters to include in the returned substring.
*/
export const substr = lazyStrMethod('substr');
/** Converts all the alphabetic characters in a string to uppercase. */
export const toUpperCase = lazyStrMethod('toUpperCase')();
/** Converts all the alphabetic characters in a string to lowercase. */
export const toLowerCase = lazyStrMethod('toLowerCase')();
/** Removes the leading and trailing white space and line terminator characters from a string. */
export const trim = lazyStrMethod('trim')();
export const startsWith = lazyStrMethod('startsWith');
export const endsWith = lazyStrMethod('endsWith');
export const getDigits = replace(/[^0-9]/g, '');