Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(word): extract wordlist filter in separate method #877

Merged
merged 2 commits into from
Apr 26, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
144 changes: 60 additions & 84 deletions src/word.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,30 @@
import type { Faker } from '.';

/**
* Filters a string array for values with a specific length.
* If length is not provided or no values with this length there found a copy of the original array is returned.
*
* @param options The options to provide
* @param options.wordList A list of word to filter
* @param options.length The exact length words should have
*/
function filterWordListByLength(options: {
wordList: string[];
length?: number;
}): string[] {
if (!options.length) {
return options.wordList;
}

const wordListWithLengthFilter = options.wordList.filter(
(word) => word.length === options.length
);

return wordListWithLengthFilter.length > 0
? wordListWithLengthFilter
: [...options.wordList];
ST-DDT marked this conversation as resolved.
Show resolved Hide resolved
}

/**
* Module to return various types of words.
*/
Expand All @@ -25,18 +50,11 @@ export class Word {
* faker.word.adjective(100) // 'complete'
*/
adjective(length?: number): string {
let wordList = this.faker.definitions.word.adjective;
if (length) {
wordList = this.faker.definitions.word.adjective.filter(
(word) => word.length === length
);
}

// If result of filtered word list is undefined, return an element
// from the unfiltered list.
return (
this.faker.random.arrayElement(wordList) ||
this.faker.random.arrayElement(this.faker.definitions.word.adjective)
return this.faker.random.arrayElement(
filterWordListByLength({
wordList: this.faker.definitions.word.adjective,
length,
})
);
}

Expand All @@ -51,18 +69,11 @@ export class Word {
* faker.word.adverb(100) // 'sadly'
*/
adverb(length?: number): string {
let wordList = this.faker.definitions.word.adverb;
if (length) {
wordList = this.faker.definitions.word.adverb.filter(
(word: string) => word.length === length
);
}

// If result of filtered word list is undefined, return an element
// from the unfiltered list.
return (
this.faker.random.arrayElement(wordList) ||
this.faker.random.arrayElement(this.faker.definitions.word.adverb)
return this.faker.random.arrayElement(
filterWordListByLength({
wordList: this.faker.definitions.word.adverb,
length,
})
);
}

Expand All @@ -77,18 +88,11 @@ export class Word {
* faker.word.conjunction(100) // 'as long as'
*/
conjunction(length?: number): string {
let wordList = this.faker.definitions.word.conjunction;
if (length) {
wordList = this.faker.definitions.word.conjunction.filter(
(word: string) => word.length === length
);
}

// If result of filtered word list is undefined, return an element
// from the unfiltered list.
return (
this.faker.random.arrayElement(wordList) ||
this.faker.random.arrayElement(this.faker.definitions.word.conjunction)
return this.faker.random.arrayElement(
filterWordListByLength({
wordList: this.faker.definitions.word.conjunction,
length,
})
);
}

Expand All @@ -103,18 +107,11 @@ export class Word {
* faker.word.interjection(100) // 'yowza'
*/
interjection(length?: number): string {
let wordList = this.faker.definitions.word.interjection;
if (length) {
wordList = this.faker.definitions.word.interjection.filter(
(word: string) => word.length === length
);
}

// If result of filtered word list is undefined, return an element
// from the unfiltered list.
return (
this.faker.random.arrayElement(wordList) ||
this.faker.random.arrayElement(this.faker.definitions.word.interjection)
return this.faker.random.arrayElement(
filterWordListByLength({
wordList: this.faker.definitions.word.interjection,
length,
})
);
}

Expand All @@ -129,18 +126,11 @@ export class Word {
* faker.word.noun(100) // 'care'
*/
noun(length?: number): string {
let wordList = this.faker.definitions.word.noun;
if (length) {
wordList = this.faker.definitions.word.noun.filter(
(word: string) => word.length === length
);
}

// If result of filtered word list is undefined, return an element
// from the unfiltered list.
return (
this.faker.random.arrayElement(wordList) ||
this.faker.random.arrayElement(this.faker.definitions.word.noun)
return this.faker.random.arrayElement(
filterWordListByLength({
wordList: this.faker.definitions.word.noun,
length,
})
);
}

Expand All @@ -155,18 +145,11 @@ export class Word {
* faker.word.preposition(100) // 'an'
*/
preposition(length?: number): string {
let wordList = this.faker.definitions.word.preposition;
if (length) {
wordList = this.faker.definitions.word.preposition.filter(
(word: string) => word.length === length
);
}

// If result of filtered word list is undefined, return an element
// from the unfiltered list.
return (
this.faker.random.arrayElement(wordList) ||
this.faker.random.arrayElement(this.faker.definitions.word.preposition)
return this.faker.random.arrayElement(
filterWordListByLength({
wordList: this.faker.definitions.word.preposition,
length,
})
);
}

Expand All @@ -181,18 +164,11 @@ export class Word {
* faker.word.verb(100) // 'mess'
*/
verb(length?: number): string {
let wordList = this.faker.definitions.word.verb;
if (length) {
wordList = this.faker.definitions.word.verb.filter(
(word: string) => word.length === length
);
}

// If result of filtered word list is undefined, return an element
// from the unfiltered list.
return (
this.faker.random.arrayElement(wordList) ||
this.faker.random.arrayElement(this.faker.definitions.word.verb)
return this.faker.random.arrayElement(
filterWordListByLength({
wordList: this.faker.definitions.word.verb,
length,
})
);
}
}