使用fp-ts时,如何在括号的获取阶段添加动态依赖?

How to add dynamic dependencies in the acquire phase of a bracket when using fp-ts?

提问人:Adam Arold 提问时间:10/29/2023 最后编辑:Adam Arold 更新时间:10/29/2023 访问量:22

问:

我想知道是否有一种方法可以将元素添加到仅存在于 .我试图做的是为我执行的东西创建一个事务,并在 中释放 tx。这是我试图实现的目标的一个简化示例:usebracketuserelease

type TxContext = {
    tx: string;
}

type MyDeps = {
    getMyData: () => RTE.ReaderTaskEither<
        TxContext,
        Error,
        string
    >;
};

const executeOperation = () =>
    bracketW(
        pipe(
            Do,
            bindW("deps", () => ask<MyDeps>()),
            // start transaction would be here
            bindW("tx", () => right("this is a transaction")),
            map(({ deps, tx }) => ({
                ...deps,
                tx,
            }))
        ),
        ({ getMyData, tx }) => {
            // no way to pass the tx to the operation here
            return pipe(
                getMyData(),
                map((data) => `got the data: ${data}`),
            );
        },
        (d, e: E.Either<Error, string>) =>
            // close transaction would be here
            pipe(fromEither(e), map(constVoid))
    );

我的问题是这会将 作为强制参数添加到 .有没有办法防止这种情况发生?作为步骤的一部分,我想在括号内创建 tx。txRReaderTaskEitheracquire

我尝试了另一种解决方案:

const executeOperation = () =>
    bracketW(
        pipe(
            Do,
            bindW("deps", () => ask<MyDeps>()),
            bindW("tx", () => right("this is a transaction")),
            map(({ deps, tx }) => ({
                ...deps,
                tx,
            }))
        ),
        (deps) => {
            const { getMyData, tx } = deps;
            // pass the deps and re-wrap into a new ReaderTaskEither
            return fromTaskEither(
                pipe(
                    getMyData(),
                    map((data) => `got the data: ${data}`)
                )({ tx })
            );
        },
        (d, e: E.Either<Error, string>) =>
            pipe(fromEither(e), map(constVoid))
    );

但这对我来说感觉很骇人听闻。fp-ts 是否有开箱即用的解决方案?

打字稿 FP-TS

评论


答: 暂无答案