Mag*_*nus 6 recursion stream lazy-evaluation typescript fp-ts
我的目标是从 API 请求交易并将其存储到数据库中。响应是分页的,我想读取每一页并批量存储交易。
因此,对于一个请求/响应周期,我希望在获取下一批之前处理结果并将其存储到数据库中。
我如何在 fp-ts 中以惯用的方式执行此操作?我注入实际的 HTTP 获取调用,(url:string, init:RequestInit) => TE.TaskEither<Error, Response>
以保持其可测试性。
到目前为止,我已经测试了 RxJS 和 fp-ts,即使我让它工作也有点复杂。
确实尝试了递归函数和生成器,但我没有成功地对其进行延迟评估。
是否有任何现有的 fp-ts 示例显示了一个延迟评估的流,其中每个元素都依赖于前一个元素?
您可以使用StateReaderTaskEither。
假设您要读取文件列表,并且下一个文件名存储在当前文件中。
import * as TE from 'fp-ts/TaskEither'
import * as RA from 'fp-ts/ReadonlyArray'
import { pipe } from 'fp-ts/function'
const files = {
file1: 'file2',
file2: 'file3',
file3: 'file5',
file4: 'file6',
file5: 'file4',
}
const getFile = (filename: string, encoding: string) =>
Promise.resolve(files[filename])
const fileSRTE: SRTE.StateReaderTaskEither<
string,
string,
unknown,
string
> = (filename: string) => (encoding: string) =>
pipe(
TE.tryCatch(
() => getFile(filename, encoding),
(err) => err
),
TE.map((file) => [`file: ${file}`, file])
)
const fileStream: TE.TaskEither<
unknown,
readonly string[]
> = pipe(
RA.replicate(6, fileSRTE),
SRTE.sequenceArray,
SRTE.evaluate('file1')
)('utf-8')
fileStream().then(console.log)
//{ _tag: 'Right',right: [ 'file: file2','file: file3','file: file5','file: file4','file: file6','file: undefined' ] }
Run Code Online (Sandbox Code Playgroud)
您可以在fp-ts Doc中详细了解 State 和 Reader
归档时间: |
|
查看次数: |
954 次 |
最近记录: |