-
-
Save jonas-schievink/46fa39d98bec27c9e29314df1a8797f2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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