Skip to content

Instantly share code, notes, and snippets.

@jonas-schievink
Created May 31, 2020 21:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jonas-schievink/46fa39d98bec27c9e29314df1a8797f2 to your computer and use it in GitHub Desktop.
Save jonas-schievink/46fa39d98bec27c9e29314df1a8797f2 to your computer and use it in GitHub Desktop.
use std::future::Future;
use std::pin::Pin;
use std::task::{Poll, Context};
use std::sync::Arc;
trait FutureExt: Sized {
fn shared(self) -> Shared<Self>;
}
impl<T: Future> FutureExt for T {
fn shared(self) -> Shared<Self> {
Shared(Arc::new(self))
}
}
struct Shared<T>(Arc<T>);
impl<T> Clone for Shared<T> {
fn clone(&self) -> Self {
Shared(self.0.clone())
}
}
impl<T: Future> Future for Shared<T> {
type Output = T::Output;
fn poll(self: Pin<&mut Self>, _cx: &mut Context) -> Poll<Self::Output> {
unimplemented!()
}
}
#[derive(PartialEq, PartialOrd, Clone)]
pub struct Data(f64);
impl Data {
fn new(value: f64) -> Self {
Data(value)
}
fn zero() -> Self {
Data(0.)
}
fn one() -> Self {
Data(1.)
}
}
impl Eq for Data {}
impl Ord for Data {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
unimplemented!()
}
}
impl std::iter::Sum for Data {
fn sum<I>(iter: I) -> Self where I: std::iter::Iterator {
unimplemented!()
}
}
impl std::iter::Product for Data {
fn product<I>(iter: I) -> Self where I: std::iter::Iterator {
unimplemented!()
}
}
pub async fn compute_dag() {
// Compute values
let node_0 = async {
//No dependencies
let result : Data = Data::new(0.24974409970844924);
result
}.shared();
let node_1 = async {
let node_0 = node_0.clone().await;
let result : Data = [node_0].iter().cloned().max().unwrap();
result
}.shared();
let node_2 = async {
let node_1 = node_1.clone().await;
let result : Data = [node_1].iter().cloned().sum();
result
}.shared();
let node_3 = async {
let node_1 = node_1.clone().await;
let result : Data = [node_1].iter().cloned().sum();
result
}.shared();
let node_4 = async {
let node_3 = node_3.clone().await;
let result : Data = [node_3].iter().cloned().max().unwrap();
result
}.shared();
let node_5 = async {
let node_3 = node_3.clone().await;
let result : Data = [node_3].iter().cloned().sum();
result
}.shared();
let node_6 = async {
//No dependencies
let result : Data = Data::zero();
result
}.shared();
let node_7 = async {
let node_0 = node_0.clone().await;
let node_4 = node_4.clone().await;
let node_6 = node_6.clone().await;
let result : Data = [node_0, node_4, node_6].iter().cloned().min().unwrap();
result
}.shared();
let node_8 = async {
let node_1 = node_1.clone().await;
let node_2 = node_2.clone().await;
let node_3 = node_3.clone().await;
let node_5 = node_5.clone().await;
let result : Data = [node_1, node_2, node_3, node_5].iter().cloned().min().unwrap();
result
}.shared();
let node_9 = async {
let node_3 = node_3.clone().await;
let node_8 = node_8.clone().await;
let result : Data = [node_3, node_8].iter().cloned().sum();
result
}.shared();
let node_10 = async {
let node_0 = node_0.clone().await;
let node_8 = node_8.clone().await;
let node_9 = node_9.clone().await;
let result : Data = [node_0, node_8, node_9].iter().cloned().max().unwrap();
result
}.shared();
let node_11 = async {
//No dependencies
let result : Data = Data::new(0.8900611698693826);
result
}.shared();
let node_12 = async {
let node_1 = node_1.clone().await;
let result : Data = [node_1].iter().cloned().product();
result
}.shared();
let node_13 = async {
let node_1 = node_1.clone().await;
let node_2 = node_2.clone().await;
let node_4 = node_4.clone().await;
let node_5 = node_5.clone().await;
let node_6 = node_6.clone().await;
let node_7 = node_7.clone().await;
let node_9 = node_9.clone().await;
let node_12 = node_12.clone().await;
let result : Data = [node_1, node_2, node_4, node_5, node_6, node_7, node_9, node_12].iter().cloned().min().unwrap();
result
}.shared();
let node_14 = async {
let node_0 = node_0.clone().await;
let node_6 = node_6.clone().await;
let node_7 = node_7.clone().await;
let node_8 = node_8.clone().await;
let result : Data = [node_0, node_6, node_7, node_8].iter().cloned().product();
result
}.shared();
let node_15 = async {
let node_0 = node_0.clone().await;
let node_1 = node_1.clone().await;
let node_3 = node_3.clone().await;
let node_4 = node_4.clone().await;
let node_5 = node_5.clone().await;
let node_6 = node_6.clone().await;
let node_8 = node_8.clone().await;
let node_10 = node_10.clone().await;
let result : Data = [node_0, node_1, node_3, node_4, node_5, node_6, node_8, node_10].iter().cloned().min().unwrap();
result
}.shared();
let node_16 = async {
let node_0 = node_0.clone().await;
let node_3 = node_3.clone().await;
let node_5 = node_5.clone().await;
let node_6 = node_6.clone().await;
let node_7 = node_7.clone().await;
let node_8 = node_8.clone().await;
let node_11 = node_11.clone().await;
let node_13 = node_13.clone().await;
let node_14 = node_14.clone().await;
let node_15 = node_15.clone().await;
let result : Data = [node_0, node_3, node_5, node_6, node_7, node_8, node_11, node_13, node_14, node_15].iter().cloned().min().unwrap();
result
}.shared();
let node_17 = async {
let node_1 = node_1.clone().await;
let node_2 = node_2.clone().await;
let node_3 = node_3.clone().await;
let node_4 = node_4.clone().await;
let node_6 = node_6.clone().await;
let node_8 = node_8.clone().await;
let node_10 = node_10.clone().await;
let node_11 = node_11.clone().await;
let node_12 = node_12.clone().await;
let node_13 = node_13.clone().await;
let node_14 = node_14.clone().await;
let node_15 = node_15.clone().await;
let result : Data = [node_1, node_2, node_3, node_4, node_6, node_8, node_10, node_11, node_12, node_13, node_14, node_15].iter().cloned().min().unwrap();
result
}.shared();
let node_18 = async {
let node_3 = node_3.clone().await;
let node_6 = node_6.clone().await;
let result : Data = [node_3, node_6].iter().cloned().sum();
result
}.shared();
let node_19 = async {
let node_5 = node_5.clone().await;
let result : Data = [node_5].iter().cloned().min().unwrap();
result
}.shared();
let node_20 = async {
//No dependencies
let result : Data = Data::new(0.24504995799252272);
result
}.shared();
let node_21 = async {
//No dependencies
let result : Data = Data::one();
result
}.shared();
let node_22 = async {
let node_3 = node_3.clone().await;
let node_7 = node_7.clone().await;
let node_10 = node_10.clone().await;
let node_13 = node_13.clone().await;
let node_15 = node_15.clone().await;
let node_21 = node_21.clone().await;
let result : Data = [node_3, node_7, node_10, node_13, node_15, node_21].iter().cloned().product();
result
}.shared();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment