Stream: beginners

Topic: generates Effect with


view this post on Zulip Nick Hallstrom (Feb 12 2023 at 23:31):

Where can I find what functions can be generated with generates Effect with? I’m curious if there’s something like traverse : List a, (a -> Effect b c) -> Effect (List b) c

view this post on Zulip Folkert de Vries (Feb 12 2023 at 23:40):

it's in crates/compiler/can/src/effect_module.rs , currently we can generate

pub(crate) struct HostedGeneratedFunctions {
    pub(crate) after: bool,
    pub(crate) map: bool,
    pub(crate) always: bool,
    pub(crate) loop_: bool,
    pub(crate) forever: bool,
}

view this post on Zulip Folkert de Vries (Feb 12 2023 at 23:41):

so, no traverse, but traverse can be expressed in terms of after

view this post on Zulip Folkert de Vries (Feb 12 2023 at 23:41):

or even in terms of Task:

map2 : Task a err, Task b err, (a, b -> c) -> Task c err
map2 = \task1, task2, mapper ->
    task1 |> Task.await \value1 ->
        task2 |> Task.map \value2 ->
            mapper value1 value2

traverse : List a, (a -> Task b err) -> Task (List b) err
traverse = \list, f ->
    walker : Task (List b) err, a -> Task (List b) err
    walker = \state, element -> map2 state (f element) List.append

    initialState = Task.succeed (List.withCapacity (List.len list))
    List.walk list initialState walker

combine : List (Task a err) -> Task (List a) err
combine = \list -> traverse list (\x -> x)

Last updated: Jul 06 2025 at 12:14 UTC