Yet another lazy evaluation library.
Install
npm install --save extra-lazy
yarn add extra-lazy
Usage
import { lazy } from 'extra-lazy'
const getValue = lazy(() => {
return value
})
const value = getValue()
API
lazy
function lazy<T>(getter: () => T): () => T
Create a value lazily.
which implicitly has memoization,
because the evaluation will only be performed once.
weakLazy
function weakLazy<T extends object>(getter: () => T): () => T
lazyFunction
function lazyFunction<Result, Args extends any[]>(
getter: () => (...args: Args) => Result
): (...args: Args) => Result
Create a function lazily.
lazyAsyncFunction
function lazyAsyncFunction<Result, Args extends any[]>(
getter: () => PromiseLike<(...args: Args) => Result>
): (...args: Args) => Promise<Result>
Create a async function lazily.
lazyStatic
function lazyStatic<T>(
getter: () => T
, deps?: unknown[] = []
): T
function withLazyStatic<Result, Args extends any[]>(
fn: (...args: Args) => Result
): (...args: Args) => Result
Example:
const fn = withLazyStatic((text: string) => lazyStatic(() => text))
fn('hello')
fn('world')
Best practices
Loop
withLazyStatic(() => {
while (condition) {
const value = lazyStatic(() => {
})
}
})
withLazyStatic(() => {
const value = lazyStatic(() => {
})
while (condition) {
}
})
Branch
withLazyStatic(() => {
if (condition) {
const value = lazyStatic(() => {
})
} else {
}
})
withLazyStatic(() => {
const value = lazyStatic(() => {
})
if (condition) {
} else {
}
})
Assertion/Validation
withLazyStatic((form: IForm) => {
if (validate(form)) {
const value = lazyStatic(() => {
})
} else {
const value = lazyStatic(() => {
})
return null
}
})
withLazyStatic((form: IForm) => {
if (validate(form)) {
const value = lazyStatic(() => {
})
} else {
return null
}
})
withLazyStatic((form: IForm) => {
if (!validate(form)) return null
const value = lazyStatic(() => {
})
})