Skip to content

Commit 3cd3b42

Browse files
committed
Add groupings tutorial
1 parent fb1ed76 commit 3cd3b42

File tree

21 files changed

+158
-261
lines changed

21 files changed

+158
-261
lines changed

rustdocs/source_json/willow25.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

rustdocs/source_json/willow_data_model.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

src/code_samples/tut_entry/01.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@ fn main() {
1313
.build().unwrap();
1414

1515
println!("{:#?}", entry);
16-
}
16+
}

src/code_samples/tut_entry/02.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@ fn main() {
1212
.payload(b"Dear reader, I've got a great idea")
1313
.build().unwrap();
1414

15+
println!("{:#?}", entry);
16+
1517
let oops = Entry::prefilled_builder(&entry)
1618
.path(path!("/blog/idea"))
1719
.timestamp(entry.timestamp() + 10.minutes())
1820
.payload(b"")
1921
.build().unwrap();
2022

21-
println!("{:#?}", entry);
2223
println!("{:#?}", oops);
23-
}
24+
}

src/code_samples/tut_entry/03.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,18 @@ fn main() {
1212
.payload(b"Dear reader, I've got a great idea")
1313
.build().unwrap();
1414

15+
println!("{:#?}", entry);
16+
1517
let oops = Entry::prefilled_builder(&entry)
1618
.path(path!("/blog/idea"))
1719
.timestamp(entry.timestamp() + 10.minutes())
1820
.payload(b"")
1921
.build().unwrap();
2022

21-
println!("{:#?}", entry);
2223
println!("{:#?}", oops);
2324

2425
assert_eq!(entry.namespace_id(), oops.namespace_id());
2526
assert_ne!(entry, oops);
2627
assert!(oops.is_newer_than(&entry));
2728
assert!(entry.is_pruned_by(&oops));
28-
}
29+
}
Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,33 @@
1-
use willow_25::Range;
1+
use willow25::prelude::*;
22

33
fn main() {
4-
// Ranges
5-
let open_range = Range::new_open(10);
6-
let closed_range = Range::new_closed(15, 20).unwrap();
7-
let closed_range2 = Range::new_closed(5, 15).unwrap();
4+
let namespace_id = NamespaceId::from([0; NAMESPACE_ID_WIDTH]);
5+
let subspace_id = SubspaceId::from([1; SUBSPACE_ID_WIDTH]);
86

9-
println!("open_range includes 5: {:?}", open_range.includes(&5));
10-
println!("open_range includes 15: {:?}", open_range.includes(&10));
7+
// Create an entry for comparisons, with a timestamp of 17.
8+
let entry = Entry::builder()
9+
.namespace_id(namespace_id)
10+
.subspace_id(subspace_id)
11+
.path(path!("/"))
12+
.timestamp(17)
13+
.payload(b"bla")
14+
.build()
15+
.unwrap();
1116

12-
println!(
13-
"open range includes closed_range: {:?}",
14-
open_range.includes_range(&closed_range)
15-
);
17+
// Can create TimeRanges from arbitrary rust ranges of Timestamps.
18+
assert!(entry.is_in(&TimeRange::from(5.into()..19.into())));
19+
assert!(entry.is_in(&TimeRange::from(5.into()..)));
20+
assert!(entry.is_in(&TimeRange::from(..19.into())));
21+
assert!(entry.is_in(&TimeRange::from(5.into()..=17.into())));
22+
assert!(entry.is_in(&TimeRange::from(..)));
23+
assert!(!entry.is_in(&TimeRange::from(33.into()..)));
1624

17-
println!(
18-
"open range includes closed_range2: {:?}",
19-
open_range.includes_range(&closed_range2)
20-
);
21-
22-
let intersection = open_range.intersection(&closed_range2);
23-
24-
match intersection {
25-
Some(new_range) => {
26-
println!("The intersection of open_range and closed_range2 is:");
27-
println!("{:#?}", new_range);
28-
}
29-
None => panic!("There is no intersection between open_range and closed_range2?!"),
30-
}
31-
}
25+
let intersection = TimeRange::from(..19.into())
26+
.intersection(&TimeRange::from(5.into()..));
27+
assert_eq!(intersection, TimeRange::from(5.into()..19.into()));
28+
assert!(entry.is_in(&intersection));
29+
assert!(entry.is_in_intersection(
30+
&TimeRange::from(..19.into()),
31+
&TimeRange::from(5.into()..),
32+
));
33+
}

src/code_samples/tut_grouping/01_output.txt

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 64 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,66 @@
1-
use willow_25::{Area, Entry, NamespaceId25, Path, PayloadDigest25, Range, SubspaceId25};
2-
use willow_data_model::grouping::AreaSubspace;
1+
use willow25::prelude::*;
32

43
fn main() {
5-
// Ranges
6-
let open_range = Range::new_open(10);
7-
let closed_range = Range::new_closed(15, 20).unwrap();
8-
let closed_range2 = Range::new_closed(5, 15).unwrap();
9-
10-
println!("open_range includes 5: {:?}", open_range.includes(&5));
11-
println!("open_range includes 15: {:?}", open_range.includes(&10));
12-
13-
println!(
14-
"open range includes closed_range: {:?}",
15-
open_range.includes_range(&closed_range)
16-
);
17-
18-
println!(
19-
"open range includes closed_range2: {:?}",
20-
open_range.includes_range(&closed_range2)
21-
);
22-
23-
let intersection = open_range.intersection(&closed_range2);
24-
25-
match intersection {
26-
Some(new_range) => {
27-
println!("The intersection of open_range and closed_range2 is:");
28-
println!("{:#?}", new_range);
29-
}
30-
None => panic!("There is no intersection between open_range and closed_range2?!"),
31-
}
32-
33-
// Areas
34-
35-
let (alfie_subspace, _key) = SubspaceId25::new();
36-
let (betty_subspace, _key) = SubspaceId25::new();
37-
let blog_path = Path::from_slices(&["blog"]).unwrap();
38-
39-
let late_time_range = Range::new_closed(500, 1000).unwrap();
40-
41-
let any_late_blog_area = Area::new(AreaSubspace::Any, blog_path, late_time_range);
42-
43-
let alfie_early_blog_entry = Entry::new(
44-
NamespaceId25::new_communal(),
45-
alfie_subspace.clone(),
46-
Path::from_slices(&["blog", "breakfast"]).unwrap(),
47-
100,
48-
0,
49-
PayloadDigest25::default(),
50-
);
51-
52-
let betty_late_blog_entry = Entry::new(
53-
NamespaceId25::new_communal(),
54-
betty_subspace.clone(),
55-
Path::from_slices(&["blog", "dinner"]).unwrap(),
56-
800,
57-
0,
58-
PayloadDigest25::default(),
59-
);
60-
61-
println!(
62-
"any_late_blog_area includes alfie_early_blog_entry: {:?}",
63-
any_late_blog_area.includes_entry(&alfie_early_blog_entry)
64-
);
65-
66-
println!(
67-
"any_late_blog_area includes betty_late_blog_entry: {:?}",
68-
any_late_blog_area.includes_entry(&betty_late_blog_entry)
69-
);
70-
71-
let alfie_everything_area = Area::new(
72-
AreaSubspace::Id(alfie_subspace),
73-
Path::new_empty(),
74-
Range::new_open(0),
75-
);
76-
77-
println!(
78-
"alfie_everything_area includes alfie_early_blog_entry: {:?}",
79-
alfie_everything_area.includes_entry(&alfie_early_blog_entry)
80-
);
81-
82-
println!(
83-
"alfie_everything_area includes betty_late_blog_entry: {:?}",
84-
alfie_everything_area.includes_entry(&betty_late_blog_entry)
85-
);
86-
}
4+
let namespace_id = NamespaceId::from([0; NAMESPACE_ID_WIDTH]);
5+
let subspace_id = SubspaceId::from([1; SUBSPACE_ID_WIDTH]);
6+
7+
// Create an entry for comparisons, with a timestamp of 17.
8+
let entry = Entry::builder()
9+
.namespace_id(namespace_id.clone())
10+
.subspace_id(subspace_id)
11+
.path(path!("/"))
12+
.timestamp(17)
13+
.payload(b"bla")
14+
.build()
15+
.unwrap();
16+
17+
// Can create TimeRanges from arbitrary rust ranges of Timestamps.
18+
assert!(entry.is_in(&TimeRange::from(5.into()..19.into())));
19+
assert!(entry.is_in(&TimeRange::from(5.into()..)));
20+
assert!(entry.is_in(&TimeRange::from(..19.into())));
21+
assert!(entry.is_in(&TimeRange::from(5.into()..=17.into())));
22+
assert!(entry.is_in(&TimeRange::from(..)));
23+
assert!(!entry.is_in(&TimeRange::from(33.into()..)));
24+
25+
let intersection = TimeRange::from(..19.into())
26+
.intersection(&TimeRange::from(5.into()..));
27+
assert_eq!(intersection, TimeRange::from(5.into()..19.into()));
28+
assert!(entry.is_in(&intersection));
29+
assert!(entry.is_in_intersection(
30+
&TimeRange::from(..19.into()),
31+
&TimeRange::from(5.into()..),
32+
));
33+
34+
// Area
35+
let alfie_subspace = SubspaceId::from([17; SUBSPACE_ID_WIDTH]);
36+
let betty_subspace = SubspaceId::from([64; SUBSPACE_ID_WIDTH]);
37+
38+
let alfie_early_blog_entry = Entry::builder()
39+
.namespace_id(namespace_id.clone())
40+
.subspace_id(alfie_subspace.clone())
41+
.path(path!("/blog/breakfast"))
42+
.timestamp(100)
43+
.payload(b"I made the most delicious pancakes today.")
44+
.build()
45+
.unwrap();
46+
47+
let betty_late_blog_entry = Entry::builder()
48+
.namespace_id(namespace_id.clone())
49+
.subspace_id(betty_subspace.clone())
50+
.path(path!("/blog/dinner"))
51+
.timestamp(800)
52+
.payload(b"Salmon is great when you're low on time.")
53+
.build()
54+
.unwrap();
55+
56+
let late_time_range = TimeRange::from(500.into()..1000.into());
57+
let any_late_blog_area = Area::new(None, path!("/blog"), late_time_range);
58+
59+
assert!(betty_late_blog_entry.is_in(&any_late_blog_area));
60+
assert!(!alfie_early_blog_entry.is_in(&any_late_blog_area));
61+
62+
let alfie_all_area = Area::new(Some(alfie_subspace), path!("/blog"), TimeRange::full());
63+
64+
assert!(!betty_late_blog_entry.is_in(&alfie_all_area));
65+
assert!(alfie_early_blog_entry.is_in(&alfie_all_area));
66+
}

src/code_samples/tut_grouping/02_output.txt

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/code_samples/tut_paths/02.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ fn main() {
1010
let ideas_path = path.append_component(component1).unwrap();
1111
let ideas_game_path = ideas_path.append_component(component2).unwrap();
1212
println!("A path with two components: {:?}", ideas_game_path);
13-
}
13+
}

0 commit comments

Comments
 (0)