deferred

Crates.iodeferred
lib.rsdeferred
version1.1.0
sourcesrc
created_at2018-12-15 05:34:39.477378
updated_at2018-12-16 05:11:18.409861
descriptionRust crate to help perform deferred execution of code logic.
homepage
repositoryhttps://github.com/PsichiX/deferred
max_upload_size
id101977
size38,602
Patryk BudzyƄski (PsichiX)

documentation

https://docs.rs/deferred

README

Deferred

Rust crate to help perform deferred execution of code logic.

Travis CI Docs.rs Crates.io

Idea

This crate can be used specifically for operations where you need to execute different parts of logic at unspecified time but you cannot use futures or any other asynchronous operations.

Usage

Record in Cargo.toml:

[dependencies]
deferred = "1.1"

Your crate module:

#[macro_use]
extern crate deferred;

use deferred::*;

fn foo(v: i32) -> Deferred<i32> {
    deferred!(v, [
        |c| state!(c.state() + 1),
        |c| foo2(c.state()).into(),
        |c| state!(c.state() + 2)
    ])
}

fn foo2(v: i32) -> Deferred<i32> {
    deferred!(v, [
      |c| state!(c.state() * 2),
      |c| state!(c.state() * 3)
    ])
}

{
  let d = foo(1);
  assert!(d.can_resume());
  assert_eq!(d.state(), Some(&1));

  let d = d.resume().unwrap();
  assert!(d.can_resume());
  assert_eq!(d.state(), Some(&2));

  let d = d.resume().unwrap();
  assert!(d.can_resume());
  assert_eq!(d.state(), Some(&4));

  let d = d.resume().unwrap();
  assert!(d.can_resume());
  assert_eq!(d.state(), Some(&12));

  let d = d.resume().unwrap();
  assert!(!d.can_resume());
  assert_eq!(d.state(), Some(&14));
}
// IS EQUIVALENT TO:
{
  let d = foo(1);
  assert_eq!(d.consume(), 14);
}
Commit count: 4

cargo fmt