Current section
Files
Jump to
Current section
Files
src/glorage.gleam
import carpenter/table
import gleam/erlang/process
import gleam/list
import gleam/string
@external(javascript, "./glorage_ffi.mjs", "run")
pub fn run(cb: fn() -> r) -> r {
let assert Ok(storage) =
get_table_name()
|> table.build
|> table.privacy(table.Private)
|> table.write_concurrency(table.NoWriteConcurrency)
|> table.read_concurrency(False)
|> table.decentralized_counters(False)
|> table.compression(False)
|> table.set
let resp = cb()
storage |> table.drop
resp
}
@external(javascript, "./glorage_ffi.mjs", "once")
pub fn once(fun: f, cb: fn() -> r) -> r {
let assert Ok(storage) = get_table_name() |> table.ref
case table.lookup(storage, fun) |> list.first {
Ok(#(_, cached)) -> cached
Error(Nil) -> {
let resp = cb()
table.insert(storage, [#(fun, resp)])
resp
}
}
}
@external(javascript, "./glorage_ffi.mjs", "with1")
pub fn with(fun: fn(a) -> r, cb: fn(r) -> resp) -> resp {
let assert Ok(storage) = get_table_name() |> table.ref
let assert Ok(#(_, cached)) = table.lookup(storage, fun) |> list.first
cached |> cb
}
@external(javascript, "./glorage_ffi.mjs", "getTableName")
fn get_table_name() -> String {
"glorage " <> process.self() |> string.inspect
}