Skip to content

Commit dd1fae5

Browse files
authored
Merge pull request #59 from imp/revmembers
Add support for DoubleEndedIterator over lists and objects
2 parents 3e60096 + 6449a28 commit dd1fae5

File tree

2 files changed

+110
-1
lines changed

2 files changed

+110
-1
lines changed

src/iterators.rs

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::collections::btree_map;
22
use std::slice;
3-
use std::iter::Iterator;
3+
use std::iter::{Iterator, DoubleEndedIterator};
44
use JsonValue;
55

66
pub enum Members<'a> {
@@ -34,6 +34,15 @@ impl<'a> Iterator for Members<'a> {
3434
}
3535
}
3636

37+
impl<'a> DoubleEndedIterator for Members<'a> {
38+
fn next_back(&mut self) -> Option<&'a JsonValue> {
39+
match *self {
40+
Members::Some(ref mut iter) => iter.next_back(),
41+
Members::None => None,
42+
}
43+
}
44+
}
45+
3746
impl<'a> Iterator for MembersMut<'a> {
3847
type Item = &'a mut JsonValue;
3948

@@ -45,6 +54,15 @@ impl<'a> Iterator for MembersMut<'a> {
4554
}
4655
}
4756

57+
impl<'a> DoubleEndedIterator for MembersMut<'a> {
58+
fn next_back(&mut self) -> Option<&'a mut JsonValue> {
59+
match *self {
60+
MembersMut::Some(ref mut iter) => iter.next_back(),
61+
MembersMut::None => None,
62+
}
63+
}
64+
}
65+
4866
impl<'a> Iterator for Entries<'a> {
4967
type Item = (&'a String, &'a JsonValue);
5068

@@ -56,6 +74,15 @@ impl<'a> Iterator for Entries<'a> {
5674
}
5775
}
5876

77+
impl<'a> DoubleEndedIterator for Entries<'a> {
78+
fn next_back(&mut self) -> Option<(&'a String, &'a JsonValue)> {
79+
match *self {
80+
Entries::Some(ref mut iter) => iter.next_back(),
81+
Entries::None => None
82+
}
83+
}
84+
}
85+
5986
impl<'a> Iterator for EntriesMut<'a> {
6087
type Item = (&'a String, &'a mut JsonValue);
6188

@@ -66,3 +93,12 @@ impl<'a> Iterator for EntriesMut<'a> {
6693
}
6794
}
6895
}
96+
97+
impl<'a> DoubleEndedIterator for EntriesMut<'a> {
98+
fn next_back(&mut self) -> Option<(&'a String, &'a mut JsonValue)> {
99+
match *self {
100+
EntriesMut::Some(ref mut iter) => iter.next_back(),
101+
EntriesMut::None => None
102+
}
103+
}
104+
}

tests/lib.rs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,21 @@ mod unit {
626626
assert!(members.next().is_none());
627627
}
628628

629+
#[test]
630+
fn array_members_rev() {
631+
let data = array![1, "foo"];
632+
633+
for member in data.members() {
634+
assert!(!member.is_null());
635+
}
636+
637+
let mut members = data.members().rev();
638+
639+
assert_eq!(members.next().unwrap(), "foo");
640+
assert_eq!(members.next().unwrap(), 1);
641+
assert!(members.next().is_none());
642+
}
643+
629644
#[test]
630645
fn array_members_mut() {
631646
let mut data = array![Null, Null];
@@ -638,6 +653,20 @@ mod unit {
638653
assert_eq!(data, array![100, 100]);
639654
}
640655

656+
#[test]
657+
fn array_members_mut_rev() {
658+
let mut data = array![Null, Null];
659+
let mut item = 100;
660+
661+
for member in data.members_mut().rev() {
662+
assert!(member.is_null());
663+
*member = item.into();
664+
item += 1;
665+
}
666+
667+
assert_eq!(data, array![item - 1, item - 2]);
668+
}
669+
641670
#[test]
642671
fn object_len() {
643672
let data = object!{
@@ -683,6 +712,30 @@ mod unit {
683712
assert!(entries.next().is_none());
684713
}
685714

715+
#[test]
716+
fn object_entries_rev() {
717+
let data = object!{
718+
"a" => 1,
719+
"b" => "foo"
720+
};
721+
722+
for (_, value) in data.entries().rev() {
723+
assert!(!value.is_null());
724+
}
725+
726+
let mut entries = data.entries().rev();
727+
728+
let (key, value) = entries.next().unwrap();
729+
assert_eq!(key, "b");
730+
assert_eq!(value, "foo");
731+
732+
let (key, value) = entries.next().unwrap();
733+
assert_eq!(key, "a");
734+
assert_eq!(value, 1);
735+
736+
assert!(entries.next().is_none());
737+
}
738+
686739
#[test]
687740
fn object_entries_mut() {
688741
let mut data = object!{
@@ -701,6 +754,26 @@ mod unit {
701754
});
702755
}
703756

757+
#[test]
758+
fn object_entries_mut_rev() {
759+
let mut data = object!{
760+
"a" => Null,
761+
"b" => Null
762+
};
763+
let mut item = 100;
764+
765+
for (_, value) in data.entries_mut().rev() {
766+
assert!(value.is_null());
767+
*value = item.into();
768+
item += 1;
769+
}
770+
771+
assert_eq!(data, object!{
772+
"a" => item - 1,
773+
"b" => item - 2
774+
});
775+
}
776+
704777
#[test]
705778
fn object_dump_minified() {
706779
let object = object!{

0 commit comments

Comments
 (0)