Current section

Files

Jump to
bright src bright.erl
Raw

src/bright.erl

-module(bright).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([init/2, update/2, compute/2, schedule/2, unwrap/1, data/1, computed/1, step/2, start/2, lazy_compute/3, lazy_schedule/3]).
-export_type([bright/2]).
-opaque bright(MRH, MRI) :: {bright,
MRH,
MRI,
list(gleam@dynamic:dynamic_()),
list(gleam@dynamic:dynamic_())}.
-file("/Users/doctor/Workspace/bright/src/bright.gleam", 21).
-spec init(MRJ, MRK) -> bright(MRJ, MRK).
init(Data, Computed) ->
{bright, Data, Computed, [], []}.
-file("/Users/doctor/Workspace/bright/src/bright.gleam", 60).
-spec update(
{bright(MSA, MSB), lustre@effect:effect(MSE)},
fun((MSA) -> {MSA, lustre@effect:effect(MSE)})
) -> {bright(MSA, MSB), lustre@effect:effect(MSE)}.
update(Bright, Update_) ->
{Bright@1, Effects} = Bright,
{Data, Effect} = Update_(erlang:element(2, Bright@1)),
{erlang:setelement(2, Bright@1, Data),
lustre@effect:batch([Effects, Effect])}.
-file("/Users/doctor/Workspace/bright/src/bright.gleam", 83).
-spec compute(
{bright(MSK, MSL), lustre@effect:effect(MSO)},
fun((MSK, MSL) -> MSL)
) -> {bright(MSK, MSL), lustre@effect:effect(MSO)}.
compute(Bright, Compute_) ->
gleam@pair:map_first(
Bright,
fun(Bright@1) ->
_pipe = Compute_(
erlang:element(2, Bright@1),
erlang:element(3, Bright@1)
),
(fun(Computed) -> erlang:setelement(3, Bright@1, Computed) end)(
_pipe
)
end
).
-file("/Users/doctor/Workspace/bright/src/bright.gleam", 109).
-spec schedule(
{bright(MST, MSU), lustre@effect:effect(MSX)},
fun((MST, MSU) -> lustre@effect:effect(MSX))
) -> {bright(MST, MSU), lustre@effect:effect(MSX)}.
schedule(Bright, Schedule_) ->
{Bright@1, Effects} = Bright,
Effect = Schedule_(erlang:element(2, Bright@1), erlang:element(3, Bright@1)),
{Bright@1, lustre@effect:batch([Effects, Effect])}.
-file("/Users/doctor/Workspace/bright/src/bright.gleam", 196).
-spec unwrap(bright(MTY, MTZ)) -> {MTY, MTZ}.
unwrap(Bright) ->
{erlang:element(2, Bright), erlang:element(3, Bright)}.
-file("/Users/doctor/Workspace/bright/src/bright.gleam", 210).
-spec data(bright(MUC, any())) -> MUC.
data(Bright) ->
erlang:element(2, Bright).
-file("/Users/doctor/Workspace/bright/src/bright.gleam", 224).
-spec computed(bright(any(), MUH)) -> MUH.
computed(Bright) ->
erlang:element(3, Bright).
-file("/Users/doctor/Workspace/bright/src/bright.gleam", 246).
-spec step(
{bright(MUK, MUL), lustre@effect:effect(MUO)},
fun((bright(MUK, MUL)) -> {MUS, lustre@effect:effect(MUO)})
) -> {MUS, lustre@effect:effect(MUO)}.
step(Bright, Next) ->
{Bright@1, Effs} = Bright,
{Model, Effs_} = Next(Bright@1),
{Model, lustre@effect:batch([Effs, Effs_])}.
-file("/Users/doctor/Workspace/bright/src/bright.gleam", 281).
-spec panic_if_different_computations_count(list(any()), list(any())) -> nil.
panic_if_different_computations_count(Old_computations, Computations) ->
Count = erlang:length(Old_computations),
gleam@bool:guard(
Count =:= 0,
nil,
fun() ->
Is_same_count = Count =:= erlang:length(Computations),
gleam@bool:guard(
Is_same_count,
nil,
fun() -> erlang:error(#{gleam_error => panic,
message => <<"Memoized computed should be consistent over time, otherwise memo can not work."/utf8>>,
module => <<"bright"/utf8>>,
function => <<"panic_if_different_computations_count"/utf8>>,
line => 289}) end
)
end
).
-file("/Users/doctor/Workspace/bright/src/bright.gleam", 38).
-spec start(
bright(MRM, MRN),
fun(({bright(MRM, MRN), lustre@effect:effect(MRS)}) -> {bright(MRM, MRN),
lustre@effect:effect(MRS)})
) -> {bright(MRM, MRN), lustre@effect:effect(MRS)}.
start(Bright, Next) ->
Old_computations = erlang:element(5, Bright),
gleam@pair:map_first(
Next({Bright, lustre@effect:none()}),
fun(New_data) ->
panic_if_different_computations_count(
Old_computations,
erlang:element(4, New_data)
),
Past_selections = lists:reverse(erlang:element(4, New_data)),
erlang:setelement(
4,
erlang:setelement(5, New_data, Past_selections),
[]
)
end
).
-file("/Users/doctor/Workspace/bright/src/bright.gleam", 296).
-spec are_dependencies_equal(any(), any()) -> boolean().
are_dependencies_equal(A, B) ->
gleam_stdlib:identity(A) =:= gleam_stdlib:identity(B).
-file("/Users/doctor/Workspace/bright/src/bright.gleam", 255).
-spec lazy_wrap(
{bright(MUV, MUW), lustre@effect:effect(MUZ)},
fun((MUV) -> MVB),
fun(({bright(MUV, MUW), lustre@effect:effect(MUZ)}, fun((MUV, MUW) -> MVF)) -> {bright(MUV, MUW),
lustre@effect:effect(MUZ)}),
fun((MUV, MUW, MVB) -> MVF)
) -> {bright(MUV, MUW), lustre@effect:effect(MUZ)}.
lazy_wrap(Bright, Selector, Setter, Compute_) ->
Selected_data = Selector(erlang:element(2, (erlang:element(1, Bright)))),
Selections = [gleam_stdlib:identity(Selected_data) |
erlang:element(4, (erlang:element(1, Bright)))],
Compute_@1 = fun(Data, Computed) ->
Compute_(Data, Computed, Selected_data)
end,
Bright@1 = {erlang:setelement(4, erlang:element(1, Bright), Selections),
erlang:element(2, Bright)},
case erlang:element(5, (erlang:element(1, Bright@1))) of
[] ->
Setter(Bright@1, Compute_@1);
[Value | Past_selections] ->
_pipe = {erlang:setelement(
5,
erlang:element(1, Bright@1),
Past_selections
),
erlang:element(2, Bright@1)},
case are_dependencies_equal(Value, Selected_data) of
true ->
fun gleam@function:identity/1;
false ->
fun(_capture) -> Setter(_capture, Compute_@1) end
end(_pipe)
end.
-file("/Users/doctor/Workspace/bright/src/bright.gleam", 142).
-spec lazy_compute(
{bright(MTD, MTE), lustre@effect:effect(MTH)},
fun((MTD) -> MTJ),
fun((MTD, MTE, MTJ) -> MTE)
) -> {bright(MTD, MTE), lustre@effect:effect(MTH)}.
lazy_compute(Bright, Selector, Compute_) ->
lazy_wrap(Bright, Selector, fun compute/2, Compute_).
-file("/Users/doctor/Workspace/bright/src/bright.gleam", 178).
-spec lazy_schedule(
{bright(MTN, MTO), lustre@effect:effect(MTR)},
fun((MTN) -> MTT),
fun((MTN, MTO, MTT) -> lustre@effect:effect(MTR))
) -> {bright(MTN, MTO), lustre@effect:effect(MTR)}.
lazy_schedule(Bright, Selector, Schedule_) ->
lazy_wrap(Bright, Selector, fun schedule/2, Schedule_).