@@ -415,6 +415,37 @@ impl<W: View> ByteCollectionView<W::Context, W> {
415415 Ok ( results)
416416 }
417417
418+ /// Loads multiple entries for reading at once with their keys.
419+ /// ```rust
420+ /// # tokio_test::block_on(async {
421+ /// # use linera_views::context::MemoryContext;
422+ /// # use linera_views::collection_view::ByteCollectionView;
423+ /// # use linera_views::register_view::RegisterView;
424+ /// # use linera_views::views::View;
425+ /// # let context = MemoryContext::new_for_testing(());
426+ /// let mut view: ByteCollectionView<_, RegisterView<_, String>> =
427+ /// ByteCollectionView::load(context).await.unwrap();
428+ /// {
429+ /// let subview = view.load_entry_mut(&vec![0, 1]).await.unwrap();
430+ /// subview.set("Bonjour".into());
431+ /// }
432+ /// let short_keys = vec![vec![0, 1], vec![0, 2]];
433+ /// let pairs = view.try_load_entries_pairs(short_keys).await.unwrap();
434+ /// assert_eq!(pairs[0].0, vec![0, 1]);
435+ /// assert_eq!(pairs[1].0, vec![0, 2]);
436+ /// let value0 = pairs[0].1.as_ref().unwrap().get();
437+ /// assert_eq!(*value0, "Bonjour".to_string());
438+ /// assert!(pairs[1].1.is_none());
439+ /// # })
440+ /// ```
441+ pub async fn try_load_entries_pairs (
442+ & self ,
443+ short_keys : Vec < Vec < u8 > > ,
444+ ) -> Result < Vec < ( Vec < u8 > , Option < ReadGuardedView < W > > ) > , ViewError > {
445+ let values = self . try_load_entries ( short_keys. clone ( ) ) . await ?;
446+ Ok ( short_keys. into_iter ( ) . zip ( values) . collect ( ) )
447+ }
448+
418449 /// Load all entries for reading at once.
419450 /// ```rust
420451 /// # tokio_test::block_on(async {
@@ -1048,6 +1079,39 @@ impl<I: Serialize, W: View> CollectionView<W::Context, I, W> {
10481079 self . collection . try_load_entries ( short_keys) . await
10491080 }
10501081
1082+ /// Loads multiple entries for reading at once with their keys.
1083+ /// The entries in indices have to be all distinct.
1084+ /// ```rust
1085+ /// # tokio_test::block_on(async {
1086+ /// # use linera_views::context::MemoryContext;
1087+ /// # use linera_views::collection_view::CollectionView;
1088+ /// # use linera_views::register_view::RegisterView;
1089+ /// # use linera_views::views::View;
1090+ /// # let context = MemoryContext::new_for_testing(());
1091+ /// let mut view: CollectionView<_, u64, RegisterView<_, String>> =
1092+ /// CollectionView::load(context).await.unwrap();
1093+ /// {
1094+ /// let _subview = view.load_entry_or_insert(&23).await.unwrap();
1095+ /// }
1096+ /// let indices = [23, 24];
1097+ /// let subviews = view.try_load_entries_pairs(indices).await.unwrap();
1098+ /// let value0 = subviews[0].1.as_ref().unwrap().get();
1099+ /// assert_eq!(*value0, String::default());
1100+ /// # })
1101+ /// ```
1102+ pub async fn try_load_entries_pairs < Q > (
1103+ & self ,
1104+ indices : impl IntoIterator < Item = Q > ,
1105+ ) -> Result < Vec < ( Q , Option < ReadGuardedView < W > > ) > , ViewError >
1106+ where
1107+ I : Borrow < Q > ,
1108+ Q : Serialize + Clone ,
1109+ {
1110+ let indices_vec: Vec < Q > = indices. into_iter ( ) . collect ( ) ;
1111+ let values = self . try_load_entries ( indices_vec. iter ( ) ) . await ?;
1112+ Ok ( indices_vec. into_iter ( ) . zip ( values) . collect ( ) )
1113+ }
1114+
10511115 /// Load all entries for reading at once.
10521116 /// ```rust
10531117 /// # tokio_test::block_on(async {
@@ -1463,6 +1527,39 @@ impl<I: CustomSerialize, W: View> CustomCollectionView<W::Context, I, W> {
14631527 self . collection . try_load_entries ( short_keys) . await
14641528 }
14651529
1530+ /// Loads multiple entries for reading at once with their keys.
1531+ /// The entries in indices have to be all distinct.
1532+ /// ```rust
1533+ /// # tokio_test::block_on(async {
1534+ /// # use linera_views::context::MemoryContext;
1535+ /// # use linera_views::collection_view::CustomCollectionView;
1536+ /// # use linera_views::register_view::RegisterView;
1537+ /// # use linera_views::views::View;
1538+ /// # let context = MemoryContext::new_for_testing(());
1539+ /// let mut view: CustomCollectionView<_, u128, RegisterView<_, String>> =
1540+ /// CustomCollectionView::load(context).await.unwrap();
1541+ /// {
1542+ /// let _subview = view.load_entry_or_insert(&23).await.unwrap();
1543+ /// }
1544+ /// let indices = [23, 42];
1545+ /// let subviews = view.try_load_entries_pairs(indices).await.unwrap();
1546+ /// let value0 = subviews[0].1.as_ref().unwrap().get();
1547+ /// assert_eq!(*value0, String::default());
1548+ /// # })
1549+ /// ```
1550+ pub async fn try_load_entries_pairs < Q > (
1551+ & self ,
1552+ indices : impl IntoIterator < Item = Q > ,
1553+ ) -> Result < Vec < ( Q , Option < ReadGuardedView < W > > ) > , ViewError >
1554+ where
1555+ I : Borrow < Q > ,
1556+ Q : CustomSerialize + Clone ,
1557+ {
1558+ let indices_vec: Vec < Q > = indices. into_iter ( ) . collect ( ) ;
1559+ let values = self . try_load_entries ( indices_vec. iter ( ) ) . await ?;
1560+ Ok ( indices_vec. into_iter ( ) . zip ( values) . collect ( ) )
1561+ }
1562+
14661563 /// Load all entries for reading at once.
14671564 /// ```rust
14681565 /// # tokio_test::block_on(async {
0 commit comments