Skip to content
/ delay Public

A dead simple data-structure for delaying side effects. Written in the excellent gleam language. Available on the Beam & in the browser!

License

Notifications You must be signed in to change notification settings

bwireman/delay

Folders and files

NameName
Last commit message
Last commit date

Latest commit

7d690f1 Â· Feb 8, 2025

History

72 Commits
Feb 8, 2025
Feb 8, 2025
Feb 8, 2025
Oct 13, 2024
Feb 8, 2025
Oct 12, 2024
Oct 12, 2024
May 31, 2024
Oct 13, 2024
Feb 27, 2024
Feb 8, 2025
Aug 18, 2021
Apr 16, 2024
Oct 13, 2024
Dec 15, 2024
Feb 8, 2025
Feb 8, 2025
Oct 13, 2024
Feb 27, 2024
Feb 8, 2025

Repository files navigation

Delay ⌚

A dead simple data-structure for delaying side effects ⌚! Written in the excellent gleam ✨ language. Supporting both Erlang & Javascript targets

test commits mit PRs Welcome 1.1.0 gleam erlang hex.pm downloads gleam js npm

Basic Usage

import gleam/io
import delay

let d = delay.delay_effect(fn() {
  io.println("Hello")
  Ok(1)
}) |> delay.map(fn(x) {
  io.println("World")
  Ok(x + 1)
})

let res = delay.run(d)
// Hello
// World
// res = Ok(2)

More info

The result of delay_effect is really just a first class function with a nice API wrapper. It isn't executed until put through one of run/1, drain/1, fallthrough/1 or one of the other functions in order to execute a delayed effect. And can be called as many times as you want.

import gleam/io
import delay

let d = delay.delay_effect(fn() {
  io.println("Hello")
  Error("bummer")
}) |> delay.map(fn(x) {
  io.println("World")
  Ok(x + 1)
})

let res = delay.run(d)
// Hello
// res = Error("bummer")

If one of the functions in the chain fails, the rest will short circuit and the error will be returned.

Effects can be retried as well via retry/3

// using the same effect `d` from above

let res = delay.retry(d, 3, 200)
|> delay.run()
// Hello
// Hello
// Hello
// Hello
// res = Error("bummer")

Usage within Javascript 🌸 directly

If you want to use this library from javascript alone, but aren't ready to embrace gleam, you can install it from npm! Docs can be found here

npm i delay-gleam
import { delay_effect, map, run } from "delay-gleam"
import { ok, error, get } from "delay-gleam/extras"

d = delay_effect(() => error(console.log("123")))
d = map(d, (_) => ok(console.log("456")))
get(run(d))
// 123

Extras

Helper functions for using this library directly in javascript can be found here

FAQ

Doesn't the concept of a delayed side effect kind of lose value in the world of actor model concurrency and zero shared memory?!

A little

Then why did you write this?

For fun

Is gleam ✨ actually excellent?

So far

About

A dead simple data-structure for delaying side effects. Written in the excellent gleam language. Available on the Beam & in the browser!

Topics

Resources

License

Stars

Watchers

Forks