js2xxx / reffect

Yet another Rust algebraic effect library using generators
9 stars 0 forks source link

Effect handler style effect group #1

Open oovm opened 1 month ago

oovm commented 1 month ago

effect group 用法感觉比较怪异

别的语言比较流行这种风格:

let provider = CounterImpl()
#[with(provider)] // 或者叫 ctl, control
{
    callCounter()
}

fn callCounter() {
    let (get, inc) = useCounter();
    inc()
    println("{}", get())
}
oovm commented 1 month ago

比如 koka 的话就是这样写

effect state<a>
  fun get() : a
  fun set( x : a ) : ()

fun state( init : a, action : () -> <state<a>,div|e> b ) : <div|e> b
  var st := init
  with handler
    fun get()  st
    fun set(i) st := i
  sumdown()

fun sumdown( sum : int = 0 ) : <state<int>,div> int
  val i = get()
  if i <= 0 then sum else
    set( i - 1 )
    sumdown( sum + i )