summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--closures/.gitignore18
-rw-r--r--closures/Cargo.toml9
-rw-r--r--closures/src/main.rs59
3 files changed, 86 insertions, 0 deletions
diff --git a/closures/.gitignore b/closures/.gitignore
new file mode 100644
index 0000000..e629269
--- /dev/null
+++ b/closures/.gitignore
@@ -0,0 +1,18 @@
+
+# Created by https://www.toptal.com/developers/gitignore/api/rust
+# Edit at https://www.toptal.com/developers/gitignore?templates=rust
+
+### Rust ###
+# Generated by Cargo
+# will have compiled files and executables
+/target/
+
+# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
+# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
+Cargo.lock
+
+# These are backup files generated by rustfmt
+**/*.rs.bk
+
+# End of https://www.toptal.com/developers/gitignore/api/rust
+
diff --git a/closures/Cargo.toml b/closures/Cargo.toml
new file mode 100644
index 0000000..209f8c2
--- /dev/null
+++ b/closures/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "closures"
+version = "0.1.0"
+authors = ["Jordan Gong <jordan.gong@protonmail.com>"]
+edition = "2018"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
diff --git a/closures/src/main.rs b/closures/src/main.rs
new file mode 100644
index 0000000..91bd189
--- /dev/null
+++ b/closures/src/main.rs
@@ -0,0 +1,59 @@
+use std::thread;
+use std::time::Duration;
+
+struct Cacher<T>
+where
+ T: Fn(u32) -> u32,
+{
+ calculation: T,
+ value: Option<u32>,
+}
+
+impl<T> Cacher<T>
+where
+ T: Fn(u32) -> u32,
+{
+ fn new(calculation: T) -> Cacher<T> {
+ Cacher {
+ calculation,
+ value: None,
+ }
+ }
+
+ fn value(&mut self, arg: u32) -> u32 {
+ match self.value {
+ Some(v) => v,
+ None => {
+ let v = (self.calculation)(arg);
+ self.value = Some(v);
+ v
+ }
+ }
+ }
+}
+
+fn generate_work(intensity: u32, random_number: u32) {
+ let mut expensive_clourse = Cacher::new(|num| {
+ println!("calculating slowly...");
+ thread::sleep(Duration::from_secs(2));
+ num
+ });
+
+ if intensity < 25 {
+ println!("Today, do {} pushups!", expensive_clourse.value(intensity));
+ println!("Next, do {} situps!", expensive_clourse.value(intensity));
+ } else {
+ if random_number == 3 {
+ println!("Take a break today! Remember to stay hydrated!");
+ } else {
+ println!("Today, run for {} minutes!", expensive_clourse.value(intensity));
+ }
+ }
+}
+
+fn main() {
+ let simulated_user_specified_value = 10;
+ let simulated_random_number = 7;
+
+ generate_work(simulated_user_specified_value, simulated_random_number);
+}