#![allow(clippy::type_complexity)]
#![allow(unused_variables)]
use super::helpers::*;
use crate::dag::{DagArmSeed, DagBuilder};
use crate::{Handler, IntoHandler, ResMut, World, fan_out, resolve_arm};
#[inline(never)]
pub fn dag_linear_1(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_linear_3(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.then(ref_double, ®)
.then(ref_add_three, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_linear_5(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.then(ref_double, ®)
.then(ref_add_three, ®)
.then(ref_square, ®)
.then(ref_sub_ten, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_linear_10(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.then(ref_double, ®)
.then(ref_add_three, ®)
.then(ref_square, ®)
.then(ref_sub_ten, ®)
.then(ref_shr_one, ®)
.then(ref_xor_mask, ®)
.then(ref_add_seven, ®)
.then(ref_triple, ®)
.then(ref_add_forty_two, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_linear_20(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.then(ref_double, ®)
.then(ref_add_three, ®)
.then(ref_square, ®)
.then(ref_sub_ten, ®)
.then(ref_shr_one, ®)
.then(ref_xor_mask, ®)
.then(ref_add_seven, ®)
.then(ref_triple, ®)
.then(ref_add_forty_two, ®)
.then(ref_add_one, ®)
.then(ref_double, ®)
.then(ref_add_three, ®)
.then(ref_square, ®)
.then(ref_sub_ten, ®)
.then(ref_shr_one, ®)
.then(ref_xor_mask, ®)
.then(ref_add_seven, ®)
.then(ref_triple, ®)
.then(ref_add_forty_two, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_linear_mixed_arity(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.then(ref_add_res_a, ®)
.then(ref_write_res_a, ®)
.then(ref_add_both, ®)
.then(ref_three_params, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_fork2_merge(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| a.then(ref_double, ®))
.arm(|a| a.then(ref_triple, ®))
.merge(merge_add, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_fork3_merge(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| a.then(ref_double, ®))
.arm(|a| a.then(ref_triple, ®))
.arm(|a| a.then(ref_add_seven, ®))
.merge(merge_3, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_fork4_merge(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| a.then(ref_double, ®))
.arm(|a| a.then(ref_triple, ®))
.arm(|a| a.then(ref_add_seven, ®))
.arm(|a| a.then(ref_xor_mask, ®))
.merge(merge_4, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_fork2_join(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| a.then(ref_consume, ®))
.arm(|a| a.then(ref_consume, ®))
.join()
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_fork3_join(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| a.then(ref_consume, ®))
.arm(|a| a.then(ref_consume, ®))
.arm(|a| a.then(ref_consume, ®))
.join()
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_fork2_merge_consume(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| a.then(ref_double, ®))
.arm(|a| a.then(ref_triple, ®))
.merge(merge_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_fork3_merge_consume(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| a.then(ref_double, ®))
.arm(|a| a.then(ref_triple, ®))
.arm(|a| a.then(ref_add_seven, ®))
.merge(merge_3_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_fork_heavy_arms(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| {
a.then(ref_double, ®)
.then(ref_add_three, ®)
.then(ref_square, ®)
.then(ref_sub_ten, ®)
.then(ref_shr_one, ®)
})
.arm(|a| {
a.then(ref_add_one, ®)
.then(ref_triple, ®)
.then(ref_xor_mask, ®)
.then(ref_add_seven, ®)
.then(ref_add_forty_two, ®)
})
.merge(merge_add, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_nested_fork(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| {
a.then(ref_double, ®)
.fork()
.arm(|b| b.then(ref_add_one, ®))
.arm(|b| b.then(ref_triple, ®))
.merge(merge_add, ®)
})
.arm(|a| a.then(ref_add_seven, ®))
.merge(merge_add, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_diamond(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| a.then(ref_double, ®))
.arm(|a| a.then(ref_triple, ®))
.merge(merge_add, ®)
.fork()
.arm(|a| a.then(ref_square, ®))
.arm(|a| a.then(ref_shr_one, ®))
.merge(merge_mul, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_guard_skip_10(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.guard(|x: &u64| *x > 100, ®)
.map(ref_double, ®)
.map(ref_add_three, ®)
.map(ref_square, ®)
.map(ref_sub_ten, ®)
.map(ref_shr_one, ®)
.map(ref_xor_mask, ®)
.map(ref_add_seven, ®)
.map(ref_triple, ®)
.map(ref_add_forty_two, ®)
.map(ref_add_one, ®)
.unwrap_or(0)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_res_err_skip_10(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(try_parse, ®)
.map(ref_add_one, ®)
.map(ref_double, ®)
.map(ref_add_three, ®)
.map(ref_square, ®)
.map(ref_sub_ten, ®)
.map(ref_shr_one, ®)
.map(ref_xor_mask, ®)
.map(ref_add_seven, ®)
.map(ref_triple, ®)
.map(ref_add_forty_two, ®)
.unwrap_or(0)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_guard(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.guard(|x: &u64| *x > 10, ®)
.unwrap_or(0)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_filter(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.guard(|x: &u64| *x > 0, ®)
.filter(|x: &u64| *x < 1000, ®)
.unwrap_or(0)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_dedup(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.dedup()
.unwrap_or(0)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_opt_map(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(maybe_positive, ®)
.map(ref_double, ®)
.unwrap_or(0)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_opt_and_then(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(maybe_positive, ®)
.and_then(ref_maybe_positive, ®)
.unwrap_or(0)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_opt_chain(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(maybe_positive, ®)
.map(ref_double, ®)
.filter(|x: &u64| *x < 1000, ®)
.inspect(|_x: &u64| {}, ®)
.on_none(|| {}, ®)
.unwrap_or_else(|| 0, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_res_map(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(try_parse, ®)
.map(ref_double, ®)
.unwrap_or(0)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_res_and_then(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(try_parse, ®)
.and_then(ref_try_parse, ®)
.unwrap_or(0)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_res_chain(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(try_parse, ®)
.map(ref_double, ®)
.and_then(ref_try_parse, ®)
.inspect(|_v: &u64| {}, ®)
.inspect_err(|_e: &u32| {}, ®)
.map_err(|e: u32| e as u64, ®)
.unwrap_or(0)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_res_catch(world: &mut World, input: u64) {
let reg = world.registry();
fn log_error(_err: &u32) {}
let mut d = DagBuilder::<u64>::new()
.root(try_parse, ®)
.catch(log_error, ®)
.unwrap_or(0)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_res_or_else(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(try_parse, ®)
.or_else(|e: u32| Ok::<u64, u32>(e as u64), ®)
.unwrap_or(0)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_bool_chain(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(is_even, ®)
.and(|| true, ®)
.or(|| false, ®)
.not()
.xor(|| true, ®)
.then(|b: &bool| -> u64 { if *b { 1 } else { 0 } }, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_route_basic(world: &mut World, input: u64) {
let reg = world.registry();
let on_true = DagArmSeed::<u64>::new().then(ref_double, ®);
let on_false = DagArmSeed::<u64>::new().then(ref_add_one, ®);
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.route(|x: &u64| *x > 100, ®, on_true, on_false)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_route_heavy_arms(world: &mut World, input: u64) {
let reg = world.registry();
let arm_t = DagArmSeed::<u64>::new()
.then(ref_double, ®)
.then(ref_add_three, ®)
.then(ref_square, ®)
.then(ref_sub_ten, ®)
.then(ref_shr_one, ®);
let arm_f = DagArmSeed::<u64>::new()
.then(ref_add_one, ®)
.then(ref_triple, ®)
.then(ref_xor_mask, ®)
.then(ref_add_seven, ®)
.then(ref_add_forty_two, ®);
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.route(|x: &u64| *x > 100, ®, arm_t, arm_f)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_switch_basic(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.then(
|x: &u64| {
if *x > 100 {
x.wrapping_mul(2)
} else {
x.wrapping_add(1)
}
},
®,
)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_switch_3way(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.then(
|x: &u64| match x % 3 {
0 => x.wrapping_mul(2),
1 => x.wrapping_add(10),
_ => x.wrapping_sub(5),
},
®,
)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_switch_resolve_arm(world: &mut World, input: u64) {
let reg = world.registry();
let mut arm_big = resolve_arm(ref_double, ®);
let mut arm_small = resolve_arm(ref_add_one, ®);
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.then(
move |world: &mut World, x: &u64| {
if *x > 100 {
arm_big(world, x)
} else {
arm_small(world, x)
}
},
®,
)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_splat2(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(split_u64, ®)
.splat()
.then(ref_splat_add, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_splat3(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(split_3, ®)
.splat()
.then(ref_splat_3, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_splat_in_arm(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| {
a.then(ref_split_u64, ®)
.splat()
.then(ref_splat_add, ®)
})
.arm(|a| a.then(ref_double, ®))
.merge(merge_add, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_tap(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.tap(|_x: &u64| {}, ®)
.then(ref_double, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_tee(world: &mut World, input: u64) {
let reg = world.registry();
let side = DagArmSeed::<u64>::new().then(ref_consume, ®);
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.tee(side)
.then(ref_double, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_tee_heavy(world: &mut World, input: u64) {
let reg = world.registry();
let side = DagArmSeed::<u64>::new()
.then(ref_add_one, ®)
.then(ref_double, ®)
.then(ref_add_three, ®)
.then(ref_square, ®)
.then(ref_consume, ®);
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.tee(side)
.then(ref_double, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_dispatch(world: &mut World, input: u64) {
let reg = world.registry();
let handler = consume_val.into_handler(®);
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.dispatch(handler)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_world_res(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_res_a, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_world_res_mut(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(write_res_a, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_world_mixed_chain(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.then(ref_add_res_a, ®)
.then(ref_write_res_a, ®)
.then(ref_double, ®)
.then(ref_add_both, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_world_3_params(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(three_params, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_wide_fan_out(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| a.then(ref_consume, ®))
.arm(|a| a.then(ref_consume, ®))
.arm(|a| a.then(ref_consume, ®))
.arm(|a| a.then(ref_consume, ®))
.join()
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_sequential_forks(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| a.then(ref_double, ®))
.arm(|a| a.then(ref_triple, ®))
.merge(merge_add, ®)
.fork()
.arm(|a| a.then(ref_square, ®))
.arm(|a| a.then(ref_shr_one, ®))
.merge(merge_mul, ®)
.fork()
.arm(|a| a.then(ref_add_one, ®))
.arm(|a| a.then(ref_xor_mask, ®))
.merge(merge_add, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_fork_with_guard(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.guard(|x: &u64| *x > 10, ®)
.unwrap_or(0)
.fork()
.arm(|a| a.then(ref_double, ®))
.arm(|a| a.then(ref_triple, ®))
.merge(merge_add, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_fork_with_route(world: &mut World, input: u64) {
let reg = world.registry();
let on_true = DagArmSeed::<u64>::new().then(ref_double, ®);
let on_false = DagArmSeed::<u64>::new().then(ref_triple, ®);
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.route(|x: &u64| *x > 100, ®, on_true, on_false)
.fork()
.arm(|a| a.then(ref_square, ®))
.arm(|a| a.then(ref_shr_one, ®))
.merge(merge_add, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_full_kitchen_sink(world: &mut World, input: u64) {
let reg = world.registry();
fn log_error(_err: &u32) {}
let tee_side = DagArmSeed::<u64>::new().then(ref_consume, ®);
let route_true = DagArmSeed::<u64>::new().then(ref_double, ®);
let route_false = DagArmSeed::<u64>::new().then(ref_triple, ®);
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.tap(|_x: &u64| {}, ®)
.then(ref_add_res_a, ®)
.guard(|x: &u64| *x > 0, ®)
.map(ref_double, ®)
.unwrap_or(0)
.tee(tee_side)
.then(ref_try_parse, ®)
.map(ref_add_one, ®)
.catch(log_error, ®)
.unwrap_or(0)
.route(|x: &u64| *x > 100, ®, route_true, route_false)
.fork()
.arm(|a| a.then(ref_square, ®))
.arm(|a| a.then(ref_shr_one, ®))
.merge(merge_add, ®)
.dedup()
.unwrap_or(0)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_linear_2(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.then(ref_double, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_deep_nested_fork(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| {
a.then(ref_double, ®)
.fork()
.arm(|b| {
b.then(ref_add_one, ®)
.fork()
.arm(|c| c.then(ref_triple, ®))
.arm(|c| c.then(ref_add_seven, ®))
.merge(merge_add, ®)
})
.arm(|b| b.then(ref_square, ®))
.merge(merge_add, ®)
})
.arm(|a| a.then(ref_xor_mask, ®))
.merge(merge_add, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_fork_then_chain(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| a.then(ref_double, ®))
.arm(|a| a.then(ref_triple, ®))
.merge(merge_add, ®)
.then(ref_add_three, ®)
.then(ref_square, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_asymmetric_arms(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| a.then(ref_double, ®))
.arm(|a| {
a.then(ref_triple, ®)
.then(ref_add_three, ®)
.then(ref_square, ®)
})
.arm(|a| {
a.then(ref_add_one, ®)
.then(ref_shr_one, ®)
.then(ref_xor_mask, ®)
.then(ref_add_seven, ®)
.then(ref_add_forty_two, ®)
})
.merge(merge_3, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_fork_arm_combinators(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| {
a.then(ref_add_one, ®)
.guard(|x: &u64| *x > 10, ®)
.map(ref_double, ®)
.unwrap_or(0)
})
.arm(|a| {
a.then(ref_triple, ®)
.guard(|x: &u64| *x > 5, ®)
.filter(|x: &u64| *x < 500, ®)
.unwrap_or_else(|| 0, ®)
})
.arm(|a| a.then(ref_add_seven, ®))
.merge(merge_3, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_filter_in_arm(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| {
a.then(ref_add_one, ®)
.guard(|x: &u64| *x > 10, ®)
.filter(|x: &u64| *x < 1000, ®)
.unwrap_or(0)
})
.arm(|a| a.then(ref_double, ®))
.merge(merge_add, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_transition_guard_ok_or(world: &mut World, input: u64) {
let reg = world.registry();
fn log_error(_err: &u32) {}
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.guard(|x: &u64| *x > 0, ®)
.ok_or(0u32)
.catch(log_error, ®)
.unwrap_or(0)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_route_in_arm(world: &mut World, input: u64) {
let reg = world.registry();
let on_true = DagArmSeed::<u64>::new().then(ref_double, ®);
let on_false = DagArmSeed::<u64>::new().then(ref_triple, ®);
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.fork()
.arm(|a| {
a.then(ref_add_one, ®)
.route(|x: &u64| *x > 50, ®, on_true, on_false)
})
.arm(|a| a.then(ref_add_seven, ®))
.merge(merge_add, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_route_nested(world: &mut World, input: u64) {
let reg = world.registry();
let mut big = resolve_arm(ref_double, ®);
let mut mid = resolve_arm(ref_triple, ®);
let mut small = resolve_arm(ref_add_one, ®);
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.then(
move |world: &mut World, x: &u64| {
if *x > 100 {
big(world, x)
} else if *x > 50 {
mid(world, x)
} else {
small(world, x)
}
},
®,
)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_splat5(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(split_5, ®)
.splat()
.then(ref_splat_5, ®)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_dispatch_fanout(world: &mut World, input: u64) {
let reg = world.registry();
fn sink_a(mut a: ResMut<ResA>, x: &u64) {
a.0 = a.0.wrapping_add(*x);
}
fn sink_b(mut a: ResMut<ResB>, x: &u64) {
a.0 = a.0.wrapping_add(*x as u32);
}
let h1 = sink_a.into_handler(®);
let h2 = sink_b.into_handler(®);
let mut d = DagBuilder::<u64>::new()
.root(add_one, ®)
.then(ref_double, ®)
.dispatch(fan_out!(h1, h2))
.build();
d.run(world, input);
}
fn leak_u64(x: u64) -> &'static u64 {
Box::leak(Box::new(x.wrapping_add(1)))
}
fn maybe_leak(x: u64) -> Option<&'static u64> {
if x > 0 {
Some(Box::leak(Box::new(x)))
} else {
None
}
}
fn try_leak(x: u64) -> Result<&'static u64, u32> {
if x < 10_000 {
Ok(Box::leak(Box::new(x)))
} else {
Err(x as u32)
}
}
#[inline(never)]
pub fn dag_cloned_bare(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(leak_u64, ®)
.cloned()
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_cloned_option(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(maybe_leak, ®)
.cloned()
.unwrap_or(0)
.then(ref_consume, ®)
.build();
d.run(world, input);
}
#[inline(never)]
pub fn dag_cloned_result(world: &mut World, input: u64) {
let reg = world.registry();
let mut d = DagBuilder::<u64>::new()
.root(try_leak, ®)
.cloned()
.unwrap_or(0)
.then(ref_consume, ®)
.build();
d.run(world, input);
}