@mic-rexjs/usecases
v2.7.10
Published
Usecases of Clean Architecture
Downloads
165
Maintainers
Readme
Description
UseCases of Clean Architecture.
Install
$ npm install --save @mic-rexjs/usecases
# -
$ yarn add --dev @mic-rexjs/usecases
Links
Usage with Non-Entity Mode
// a.ts
import { Reducers } from '@mic-rexjs/usecases';
type MathReducers = Reducers<{
add(value1: number, value2: number): number;
subtraction(value1: number, value2: number): number;
}>;
const mathUseCase = (): MathReducers => {
const add = (value1: number, value2: number): number => {
return value1 + value2;
};
const subtraction = (value1: number, value2: number): number => {
return value1 - value2;
};
return { add, subtraction };
};
// b.ts
const { add, subtraction } = mathUseCase();
add(1, 2); // 3
subtraction(5, 3); // 2
Usage with Entity Mode
// a.ts
import {
objectUseCase,
ObjectReducers,
EntityGenerator,
EntityReducers
} from '@mic-rexjs/usecases';
interface File {
path: string;
content: string;
}
interface FileUseCaseOptions {
maxContentLength?: number;
}
// All reducers should provide the first argument with an entity type T, such as `file: T`.
type FileReducers<T extends File> = EntityReducers<
T,
{
writeFile(entity: T, content: string): EntityGenerator<T, string>;
isTxt(entity: T): boolean;
},
// optional to extends an existed reducers
ObjectReducers<T>
>;
const fileUseCase = <T extends File>({ maxContentLength = 2000 }: FileUseCaseOptions = {}): FileReducers<T> => {
/**
* if you have not extends an existed reducers,
* you should call `entityUseCase` at here,
* such as `const entityReducers = entityUseCase<T>()`.
*/
const objectReducers = objectUseCase<T>();
const writeFile = function* (entity: T, content: string): EntityGenerator<T, string> {
const { content: oldContent } = entity;
const newContent = oldContent + content;
if (newContent.length > maxContentLength) {
throw 'max length error';
}
// set new entity by yield expression
yield {
...entity,
content: newContent,
};
// return the new content
return newContent;
};
const isTxt = (entity: T): boolean => {
const { path } = entity;
return path.endsWith('.txt');
};
return { ...objectReducers, writeFile, isTxt };
};
// b.ts
const defaultFile: File = { path: '', content: '' };
const { createEntityReducers } = entityReducerUseCase();
const { writeFile, isTxt, setEntity } = createEntityReducers(defaultFile, fileUseCase, { maxContentLength: 50 });
// no need to provide an entity parameter when you call these reducers!
const [entity1, content1] = writeFile('hello world');
isTxt(); // false
console.log(entity1); // { path: '', content: 'hello world' }
console.log(content1); // 'hello world'
const [entity2] = setEntity({ path: 'my.txt' });
isTxt(); // true
console.log(entity2); // { path: 'my.txt', content: 'hello world' }
Usage with React
See more about @mic-rexjs/usecases-react