Skip to content

Commit

Permalink
refactor: internal predicate fns for readability
Browse files Browse the repository at this point in the history
  • Loading branch information
angeloashmore committed May 13, 2021
1 parent 77b5ddb commit 731a444
Showing 1 changed file with 49 additions and 22 deletions.
71 changes: 49 additions & 22 deletions src/predicate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,21 @@ const formatValue = (
| Date
| unknown
| (string | number | Date | unknown)[],
): string =>
Array.isArray(value)
? `[${value.map(formatValue).join(', ')}]`
: typeof value === 'string'
? `"${value}"`
: value instanceof Date
? `${value.getTime()}`
: `${value}`
): string => {
if (Array.isArray(value)) {
return `[${value.map(formatValue).join(', ')}]`
}

if (typeof value === 'string') {
return `"${value}"`
}

if (value instanceof Date) {
return `${value.getTime()}`
}

return `${value}`
}

/**
* Creates a predicate builder function for predicates with a path and arguments.
Expand All @@ -28,15 +35,19 @@ const formatValue = (
*
* @returns Predicate builder function for the given name.
*/
const pathWithArgsPredicate =
<Args extends unknown[]>(name: string) =>
const pathWithArgsPredicate = <Args extends unknown[]>(name: string) => {
/**
* @param path Path to the value to be compared.
*/
(path: string, ...args: Args): string =>
`[${name}(${path}${path && args.length ? ', ' : ''}${args
.map(formatValue)
.join(', ')})]`
const fn = (path: string, ...args: Args): string => {
const formattedArgs = args.map(formatValue).join(', ')
const joiner = path && args.length ? ', ' : ''

return `[${name}(${path}${joiner}${formattedArgs})]`
}

return fn
}

/**
* Creates a predicate builder function for predicates with only a path.
Expand All @@ -45,10 +56,18 @@ const pathWithArgsPredicate =
*
* @returns Predicate builder function for the given name.
*/
const pathPredicate =
(name: string) =>
(path: string): string =>
pathWithArgsPredicate(name)(path)
const pathPredicate = (name: string) => {
const predicateFn = pathWithArgsPredicate(name)

/**
* @param path Path for the predicate.
*/
const fn = (path: string): string => {
return predicateFn(path)
}

return fn
}

/**
* Creates a predicate builder function for predicates with only arguments and no path.
Expand All @@ -57,10 +76,18 @@ const pathPredicate =
*
* @returns Predicate builder function for the given name.
*/
const argsPredicate =
<Args extends unknown[]>(name: string) =>
(...args: Args): string =>
pathWithArgsPredicate<Args>(name)('', ...args)
const argsPredicate = <Args extends unknown[]>(name: string) => {
const predicateFn = pathWithArgsPredicate<Args>(name)

/**
* @param args Arguments for the predicate.
*/
const fn = (...args: Args): string => {
return predicateFn('', ...args)
}

return fn
}

/**
* The default arguments allowed by predicates.
Expand Down

0 comments on commit 731a444

Please sign in to comment.