仅在选项<>时执行异步操作是一些

时间:2017-10-31 17:57:35

标签: language-ext

在使用language-ext库的一段代码中,只有在实际填充Option<>中间结果时才能执行异步操作:

async Task<Option<MyEntity>> FindEntityAsync(string entityId)
{
    Option<MyEntity> entityOpt = await GetEntityAsync(entityId);

    if (entityOpt.IsSome)
    {
        await DoSomethingAsync(entityOpt.First());
    }

    return entityOpt;
}

// Task<Option<MyEntity>> GetEntityAsync(string entityId) { ... }

// DoSomethingAsync could either be:
//   Task DoSomethingAsync(MyEntity entity) { ... }
// or:
//   Task<Unit> DoSomethingAsync(MyEntity entity)

我正在寻找更多惯用的方式(对于这样的库)来实现同样的目标。

我尝试了以下但不起作用:

// look ma! No async/await here
Task<Option<MyEntity>> FindEntityAsync(string entityId)
{
    Task<Option<MyEntity>> result =

        from entity in GetEntityAsync(entityId)

        from _ in DoSomethingAsync(entity).Map(Some)

        select entity;

    return result;
}

LanguageExt.ValueIsNoneExceptionOption<>时,我遇到了一些None

理想情况下,我希望使用IterXxx类型的运算符,以便遍历包装的Option<MyEntity>只有在有某些内容时才会这样做:

Task<Option<MyEntity>> FindEntityAsync(string entityId)
{
    Task<Option<MyEntity>> result = GetEntityAsync(entityId);

    result.IterXxxx(async entity => await DoSomethingAsync(entity));

    return result;
}

但我找不到任何适合使用异步操作的签名。任何提示?

1 个答案:

答案 0 :(得分:0)

特殊类型OptionAsync<T>用于组合两个monad - Option和Async。 有关更多信息,请参阅github - https://github.com/louthy/language-ext/issues/206