Skip to main content

src/version_bump@task.erl

-module(version_bump@task).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/version_bump/task.gleam").
-export([resolve/1, map/2, await/2, run/2]).
-export_type([task/1]).

-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.

?MODULEDOC(
    " A minimal cross-target async abstraction.\n"
    "\n"
    " `Task(a)` is a deferred computation yielding an `a`. On the JavaScript target\n"
    " it is backed by a `Promise`; on the Erlang/BEAM target there are no promises,\n"
    " so it is simply the eagerly-computed value (an identity \"monad\"). The\n"
    " combinators have target-specific FFI implementations (`version_bump_task_ffi.erl` and\n"
    " `version_bump_task_ffi.mjs`) so the rest of the pipeline can sequence asynchronous work\n"
    " — chiefly the GitHub HTTP request — without caring which target it compiles\n"
    " for.\n"
    "\n"
    " On Erlang every combinator runs immediately and synchronously; on JavaScript\n"
    " they defer onto the microtask/promise queue.\n"
).

-type task(KMQ) :: any() | {gleam_phantom, KMQ}.

-file("src/version_bump/task.gleam", 20).
?DOC(" A task that is already complete with `value`.\n").
-spec resolve(KMR) -> task(KMR).
resolve(Value) ->
    version_bump_task_ffi:resolve(Value).

-file("src/version_bump/task.gleam", 25).
?DOC(" Transform the eventual value of a task.\n").
-spec map(task(KMT), fun((KMT) -> KMV)) -> task(KMV).
map(Task, F) ->
    version_bump_task_ffi:map(Task, F).

-file("src/version_bump/task.gleam", 30).
?DOC(" Chain a task-producing function onto a task (monadic bind / promise \"then\").\n").
-spec await(task(KMX), fun((KMX) -> task(KMZ))) -> task(KMZ).
await(Task, F) ->
    version_bump_task_ffi:await(Task, F).

-file("src/version_bump/task.gleam", 36).
?DOC(
    " Run a task for its effect once it settles, passing the value to `f`. On\n"
    " Erlang this is immediate; on JavaScript `f` runs when the promise resolves.\n"
).
-spec run(task(KNC), fun((KNC) -> nil)) -> nil.
run(Task, F) ->
    version_bump_task_ffi:run(Task, F).