@@ -11,6 +11,7 @@ use multihash::Code;
11
11
use serde:: de:: DeserializeOwned ;
12
12
use serde:: { Serialize , Serializer } ;
13
13
14
+ use crate :: iter:: Iter ;
14
15
use crate :: node:: Node ;
15
16
use crate :: { AsHashedKey , Config , Error } ;
16
17
@@ -352,6 +353,209 @@ where
352
353
V : DeserializeOwned ,
353
354
F : FnMut ( & K , & V ) -> anyhow:: Result < ( ) > ,
354
355
{
355
- self . root . for_each ( self . store . borrow ( ) , & mut f)
356
+ for res in self {
357
+ let ( k, v) = res?;
358
+ ( f) ( k, v) ?;
359
+ }
360
+ Ok ( ( ) )
361
+ }
362
+ }
363
+
364
+ impl < BS , V , K , H , const N : usize > Kamt < BS , K , V , H , N >
365
+ where
366
+ K : DeserializeOwned + PartialOrd ,
367
+ V : DeserializeOwned ,
368
+ BS : Blockstore ,
369
+ {
370
+ /// Returns an iterator over the entries of the map.
371
+ ///
372
+ /// The iterator element type is `Result<(&'a K, &'a V), Error>`.
373
+ ///
374
+ /// # Examples
375
+ ///
376
+ /// ```
377
+ /// use fvm_ipld_kamt::Kamt;
378
+ /// use fvm_ipld_kamt::id::Identity;
379
+ ///
380
+ /// let store = fvm_ipld_blockstore::MemoryBlockstore::default();
381
+ ///
382
+ /// let mut map: Kamt<_, u32, _, Identity> = Kamt::new(store);
383
+ /// map.set(1, 1).unwrap();
384
+ /// map.set(4, 2).unwrap();
385
+ ///
386
+ /// let mut x: u32 = 0;
387
+ /// for res in map.iter() {
388
+ /// let (key, value) = res.unwrap();
389
+ /// println!("key: {}, value: {}", key, value);
390
+ /// x = x+1;
391
+ /// }
392
+ /// assert_eq!(x,2)
393
+ /// ```
394
+ pub fn iter ( & self ) -> Iter < BS , V , K , H , N > {
395
+ Iter :: new ( & self . store , & self . root )
396
+ }
397
+
398
+ /// Iterate over the KAMT starting at the given key.
399
+ ///
400
+ /// # Examples
401
+ ///
402
+ /// ```
403
+ /// use fvm_ipld_kamt::Kamt;
404
+ /// use fvm_ipld_kamt::id::Identity;
405
+ ///
406
+ /// let store = fvm_ipld_blockstore::MemoryBlockstore::default();
407
+ ///
408
+ /// let mut map: Kamt<_, u32, _, Identity> = Kamt::new(store);
409
+ /// map.set(1, 1).unwrap();
410
+ /// map.set(2, 4).unwrap();
411
+ /// map.set(3, 3).unwrap();
412
+ /// map.set(4, 2).unwrap();
413
+ ///
414
+ /// let mut results = map.iter().take(2).collect::<Result<Vec<_>, _>>().unwrap();
415
+ ///
416
+ /// let last_key = results.last().unwrap().0;
417
+ ///
418
+ /// for res in map.iter_from(last_key).unwrap().skip(1) {
419
+ /// results.push(res.unwrap());
420
+ /// }
421
+ ///
422
+ /// println!("{:?}", results);
423
+ /// assert_eq!(results.len(), 4);
424
+ /// ```
425
+
426
+ /// Iterate over the KAMT starting at the given key. This can be used to implement "ranged" iteration:
427
+ ///
428
+ /// ```rust
429
+ /// use fvm_ipld_kamt::Kamt;
430
+ /// use fvm_ipld_blockstore::MemoryBlockstore;
431
+ /// use fvm_ipld_kamt::id::Identity;
432
+ /// use fvm_ipld_kamt::Config;
433
+ /// let store = MemoryBlockstore::default();
434
+ ///
435
+ /// // Create a Kamt with 5 keys, a-e.
436
+ /// let mut kamt: Kamt<_, u32, String, Identity> = Kamt::new_with_config(store, Config {
437
+ /// bit_width: 5,
438
+ /// ..Default::default()
439
+ /// });
440
+ /// let kvs: Vec<(u32, String)> = ["a", "b", "c", "d", "e"]
441
+ /// .iter()
442
+ /// .enumerate()
443
+ /// .map(|(index, &k)| (index as u32, k.to_owned()))
444
+ /// .collect();
445
+ /// kvs.iter()
446
+ /// .map(|(k, v)|kamt.set(k.clone(), v.clone())
447
+ /// .map(|_|()))
448
+ /// .collect::<Result<(), _>>()?;
449
+ ///
450
+ /// // Read 2 elements.
451
+ /// let mut results = kamt.iter().take(2).collect::<Result<Vec<(_,_)>, _>>()?;
452
+ /// assert_eq!(results.len(), 2);
453
+ /// // Read the rest then sort.
454
+ /// for res in kamt.iter_from(results.last().unwrap().0)?.skip(1) {
455
+ /// results.push((res?));
456
+ /// }
457
+ /// results.sort_by_key(|kv| kv.1);
458
+ ///
459
+ /// // Assert that we got out what we put in.
460
+ /// let results: Vec<_> = results.into_iter().map(|(k, v)|(k.clone(), v.clone())).collect();
461
+ /// assert_eq!(kvs, results);
462
+ ///
463
+ /// # anyhow::Ok(())
464
+ /// ```
465
+
466
+ pub fn iter_from < Q > ( & self , key : & Q ) -> Result < Iter < BS , V , K , H , N > , Error >
467
+ where
468
+ K : Borrow < Q > ,
469
+ Q : PartialEq ,
470
+ H : AsHashedKey < Q , N > ,
471
+ {
472
+ Iter :: new_from ( & self . store , & self . root , key, & self . conf )
473
+ }
474
+ }
475
+
476
+ impl < ' a , BS , V , K , H , const N : usize > IntoIterator for & ' a Kamt < BS , K , V , H , N >
477
+ where
478
+ K : DeserializeOwned + PartialOrd ,
479
+ V : DeserializeOwned ,
480
+
481
+ BS : Blockstore ,
482
+ {
483
+ type Item = Result < ( & ' a K , & ' a V ) , Error > ;
484
+ type IntoIter = Iter < ' a , BS , V , K , H , N > ;
485
+
486
+ fn into_iter ( self ) -> Self :: IntoIter {
487
+ self . iter ( )
488
+ }
489
+ }
490
+
491
+ #[ cfg( test) ]
492
+ mod tests {
493
+ use super :: * ;
494
+ use crate :: id:: Identity ;
495
+ use fvm_ipld_blockstore:: MemoryBlockstore ;
496
+
497
+ #[ test]
498
+
499
+ fn test_iter_from ( ) -> anyhow:: Result < ( ) > {
500
+ let store = MemoryBlockstore :: default ( ) ;
501
+
502
+ // Create a Kamt with 5 keys, a-e.
503
+ let mut kamt: Kamt < _ , [ u8 ; 32 ] , String , Identity > =
504
+ Kamt :: new_with_config ( store, Config :: default ( ) ) ;
505
+
506
+ let keys: Vec < [ u8 ; 32 ] > = vec ! [
507
+ hex:: decode( "0000000000000000000000000000000000000000000000000000000000000001" )
508
+ . unwrap( )
509
+ . try_into( )
510
+ . unwrap( ) ,
511
+ hex:: decode( "0000000000000000000000000000000000000000000000000000000000000002" )
512
+ . unwrap( )
513
+ . try_into( )
514
+ . unwrap( ) ,
515
+ hex:: decode( "0100000000000000000000000000000000000000000000000000000000000001" )
516
+ . unwrap( )
517
+ . try_into( )
518
+ . unwrap( ) ,
519
+ hex:: decode( "0100000000000000000000000000000000000000000000000000000000000002" )
520
+ . unwrap( )
521
+ . try_into( )
522
+ . unwrap( ) ,
523
+ hex:: decode( "0100000000000000000000000000000000000000000000000000000000000003" )
524
+ . unwrap( )
525
+ . try_into( )
526
+ . unwrap( ) ,
527
+ hex:: decode( "0200000000000000000000000000000000000000000000000000000000000001" )
528
+ . unwrap( )
529
+ . try_into( )
530
+ . unwrap( ) ,
531
+ hex:: decode( "0200000000000000000000000000000000000000000000000000000000000002" )
532
+ . unwrap( )
533
+ . try_into( )
534
+ . unwrap( ) ,
535
+ ] ;
536
+
537
+ for ( i, key) in keys. iter ( ) . enumerate ( ) {
538
+ let value = format ! ( "value{}" , i + 1 ) ;
539
+
540
+ kamt. set ( * key, value) ?;
541
+ }
542
+ let kvs: Vec < ( & [ u8 ; 32 ] , & String ) > = keys
543
+ . iter ( )
544
+ . map ( |k| ( k, kamt. get ( k) . unwrap ( ) . unwrap ( ) ) )
545
+ . collect ( ) ;
546
+
547
+ // Read 2 elements.
548
+ let mut results = kamt. iter ( ) . take ( 2 ) . collect :: < Result < Vec < _ > , _ > > ( ) ?;
549
+ assert_eq ! ( results. len( ) , 2 ) ;
550
+
551
+ // Read the rest. Don't bother sorting because the KAMT stores keys in sorted order.
552
+ for res in kamt. iter_from ( results. last ( ) . unwrap ( ) . 0 ) ?. skip ( 1 ) {
553
+ results. push ( res?) ;
554
+ }
555
+
556
+ // Assert that we got out what we put in.
557
+ assert_eq ! ( kvs, results) ;
558
+
559
+ Ok ( ( ) )
356
560
}
357
561
}
0 commit comments