var

Types

错误类型:

回调函数异常

pub type Callback {
  Callback(err: error.Exception)
}

Constructors

scope函数的错误类型

pub type ScopeError {
  StartErr(err: actor.StartError)
  CallbackErr(err: Callback)
}

Constructors

错误类型:

超时

pub type Timeout {
  Timeout
}

Constructors

  • Timeout

Var

opaque

包含可变值的通信道

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

pub opaque type Var(var)

Values

pub fn assign(var: Var(var), val: var) -> var

赋值

赋值后返回新的值

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

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

Example

use val <- var.scope(5, 1000)
assert var.read(val) == 5
assert var.assign(val, 10) == 10
assert var.read(val) == 10
pub fn assign_forever(var: Var(var), val: var) -> var

赋值并一直等待直至成功

赋值后返回新的值

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

检查可变值是否被销毁

Notice

不要过度相信这个结果,因为值可能前脚还存活后脚就被销毁了

Example

该函数主要用在可变值疑似出逃的情景,例如可变值被其他进程持有,那么该进程在使用时可以进行防御性检查,例如:

// 假设进程 1 创建可变值并发送给了进程 2
// 进程 2 持有可变值并在使用时先进行检查
case var.is_destroy(val) {
  // 值被销毁
  True -> // ...
  // 值未被销毁
  False -> // ...
}
pub fn proc(
  var: Var(var),
  f: fn(var) -> var,
) -> Result(var, Callback)

使用回调函数对值进行处理,返回处理后的新值

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

Notice

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

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

Return

Ok:回调函数正常结束返回的新的值

Error:回调函数异常返回的错误类型

Example

use val <- var.scope(5, 1000)
assert var.proc(val, fn(v) { { v + 1 } * 2 }) == Ok(12)
var.proc(val, fn(_) { panic }) // Error(..)
assert var.read(val) == 12
pub fn read(var: Var(var)) -> var

读取值

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

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

Example

use val <- var.scope(5, 1000)
assert var.read(val) == 5
pub fn read_forever(var: Var(var)) -> var

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

pub fn scope(
  init_val: var,
  time_out: Int,
  scope_fn: fn(Var(var)) -> reason,
) -> Result(reason, ScopeError)

创建一个进程模拟可变值

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

Notice

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

例如如果在值销毁后仍有进程在持有可变值并尝试使用try_read函数读取,虽然进程已经终止但返回的依然是Error(Timeout)

Param

init_val:初始值

time_out:作为readassign函数的操作超时上限(毫秒)

scope_fn:一个接受Var类型作为参数的回调函数,可在该函数内使用可变值

Return

Ok:回调函数正常结束返回的结果

Error:进程启动失败或回调函数异常返回的错误类型

Example

use val <- var.scope(5, 1000)
// ...
pub fn try_assign(
  var: Var(var),
  val: var,
) -> Result(var, Timeout)

赋值

赋值后返回新的值

Return

Ok:成功赋值返回的新值

Error:超时后返回的错误类型

pub fn try_read(var: Var(var)) -> Result(var, Timeout)

读取值

Return

Ok:读取成功返回的值

Error:超时返回的错误类型

Search Document