var

Types

属于scope函数的错误类型

pub type ScopeError {
  StartErr(err: actor.StartError)
  ScopeErr(err: error.Exception)
}

Constructors

属于try_get/try_set函数的错误类型

pub type Timeout {
  Timeout
}

Constructors

  • Timeout

    超时

subscribe函数返回的用于取消订阅的函数的返回值

pub opaque type Unsubscribed

属于update函数的错误类型

pub type UpdateError {
  UpdateErr(err: error.Exception)
}

Constructors

要与可变值交互需要持有此类型

pub opaque type Var(var)

Values

pub fn get(var: Var(var), timeout: Int) -> var

在指定时间内(毫秒)获取值

操作可能超时,可以使用try_get

如果想一直等待可以使用get_forever

Panic

可变值进程关闭后使用该函数会导致异常

pub fn get_forever(var: Var(var)) -> var

获取值并一直等待直至成功

Panic

可变值进程关闭后使用该函数会导致异常

pub fn is_alive(var: Var(var)) -> Bool

检查可变值是否存活

该函数主要用在可变值疑似出逃的情景,使用前可以进行检查

Notice

不要过度相信这个结果,因为可变值进程可能前脚还存活后脚就关闭了

pub fn scope(
  val: var,
  scope: fn(Var(var)) -> return,
) -> Result(return, ScopeError)

创建一个进程模拟可变值

可变值在回调函数中可用,函数结束自动销毁

Notice

如果回调函数已经结束,但仍有进程在持有可变值则有引发异常的风险

对于可变值出逃后的行为不作保障

let sub = process.new_subject()
// 将Var传到回调外部
// 随后回调结束,进程关闭
var.scope(5, fn(val) { process.send(sub, val) })
let val = process.receive_forever(sub)

// 进程已关闭,这里会产生异常
var.get(val, 1000)

Param

val:初始值

scope:一个接受可变值(Var)作为参数的函数

pub fn set(var: Var(var), timeout: Int, new_val: var) -> var

在指定时间内(毫秒)设置值,随后后返回新的值

操作可能超时,可以使用try_set

如果想一直等待可以使用set_forever

Panic

可变值进程关闭后使用该函数会导致异常

pub fn set_forever(var: Var(var), new_val: var) -> var

设置值并一直等待直至成功,随后返回新的值

Panic

可变值进程关闭后使用该函数会导致异常

pub fn subscribe(
  var: Var(var),
  subscribe: fn(var, var) -> discard,
) -> fn() -> Unsubscribed

订阅函数,每当成功set/update时自动调用订阅函数

订阅函数发生异常一般不会有后果

该函数会为每个订阅spawn一个进程,如果订阅函数执行的较慢则会导致消息堆积

Notice

订阅函数只接收订阅后的值,不补发当前值

在订阅函数中set/update同一个Var会导致循环

use val <- var.scope(5)

var.subscribe(val, fn(old, new) {
  io.println(int.to_string(old) <> " -> " <> int.to_string(new))
  var.set(val, 1000, new + 1)
})

var.set(val, 1000, 6)

Param

subscribe: 接收旧值和新值的订阅函数(subscribe(old_val, new_val))

Return

返回一个用于取消订阅的函数

pub fn try_get(
  var: Var(var),
  timeout: Int,
) -> Result(var, Timeout)

尝试在指定时间内(毫秒)获取值

pub fn try_set(
  var: Var(var),
  timeout: Int,
  new_val: var,
) -> Result(var, Timeout)

尝试在指定时间内(毫秒)设置值,随后返回新的值

pub fn update(
  var: Var(var),
  update: fn(var) -> var,
) -> Result(var, UpdateError)

使用函数更新值,随后返回更新后的值

若函数异常则保持原有值不变

Notice

该函数没有超时保护,会一直等待直至回调函数返回或异常

如果回调函数卡住则会造成阻塞,导致其他操作超时

Panic

可变值进程关闭后使用该函数会导致异常

✨ Search Document