1
- use crate :: protocol:: Protocol ;
2
- use crate :: value:: Value ;
3
- use crate :: value:: ToValue ;
4
- use crate :: persistent_list_map:: PersistentListMapIter ;
5
- use crate :: persistent_vector:: PersistentVectorIter ;
6
1
use crate :: persistent_list:: PersistentListIter ;
7
- use crate :: persistent_list_map:: ToPersistentListMapIter ;
8
- use crate :: persistent_vector:: ToPersistentVectorIter ;
9
2
use crate :: persistent_list:: ToPersistentListIter ;
3
+ use crate :: persistent_list_map:: PersistentListMapIter ;
4
+ use crate :: persistent_list_map:: ToPersistentListMapIter ;
5
+ use crate :: persistent_vector:: PersistentVectorIter ;
10
6
use crate :: persistent_vector:: ToPersistentVector ;
11
- use std:: rc:: Rc ;
7
+ use crate :: persistent_vector:: ToPersistentVectorIter ;
8
+ use crate :: protocol:: Protocol ;
9
+ use crate :: value:: ToValue ;
10
+ use crate :: value:: Value ;
12
11
use std:: iter:: FromIterator ;
12
+ use std:: rc:: Rc ;
13
13
14
14
//
15
15
// This Protocol lives inside of Clojure RS
16
16
//
17
- #[ derive( Debug , Clone ) ]
17
+ #[ derive( Debug , Clone ) ]
18
18
pub struct Iterable {
19
- value : Rc < Value >
19
+ value : Rc < Value > ,
20
20
}
21
21
impl Protocol for Iterable {
22
22
fn try_as_protocol ( val : & Rc < Value > ) -> Option < Self > {
23
23
match & * * val {
24
- Value :: PersistentList ( _) =>
25
- Some ( Iterable { value : Rc :: clone ( val) } ) ,
26
- Value :: PersistentVector ( _) =>
27
- Some ( Iterable { value : Rc :: clone ( val) } ) ,
28
- Value :: PersistentListMap ( _) =>
29
- Some ( Iterable { value : Rc :: clone ( val) } ) ,
30
- _ =>
31
- None
24
+ Value :: PersistentList ( _) => Some ( Iterable {
25
+ value : Rc :: clone ( val) ,
26
+ } ) ,
27
+ Value :: PersistentVector ( _) => Some ( Iterable {
28
+ value : Rc :: clone ( val) ,
29
+ } ) ,
30
+ Value :: PersistentListMap ( _) => Some ( Iterable {
31
+ value : Rc :: clone ( val) ,
32
+ } ) ,
33
+ _ => None ,
32
34
}
33
35
}
34
36
fn try_unwrap ( & self ) -> Option < Rc < Value > > {
35
37
match & * self . value {
36
38
Value :: PersistentList ( _) => Some ( Rc :: clone ( & self . value ) ) ,
37
39
Value :: PersistentVector ( _) => Some ( Rc :: clone ( & self . value ) ) ,
38
40
Value :: PersistentListMap ( _) => Some ( Rc :: clone ( & self . value ) ) ,
39
- _ => None
41
+ _ => None ,
40
42
}
41
- }
43
+ }
42
44
}
43
45
pub enum IterableIter {
44
46
PersistentList ( PersistentListIter ) ,
@@ -55,24 +57,32 @@ impl Iterator for IterableIter {
55
57
let maybe_map_entry = plist_map_iter. next ( ) ;
56
58
if let Some ( map_entry) = maybe_map_entry {
57
59
// In Clojure: [key val]
58
- return Some ( vec ! [ map_entry. key. clone( ) , map_entry. val. clone( ) ] . into_vector ( ) . to_rc_value ( ) ) ;
60
+ return Some (
61
+ vec ! [ map_entry. key. clone( ) , map_entry. val. clone( ) ]
62
+ . into_vector ( )
63
+ . to_rc_value ( ) ,
64
+ ) ;
59
65
}
60
- None
66
+ None
61
67
}
62
68
}
63
69
}
64
70
}
65
71
impl Iterable {
66
- pub fn iter ( & self ) -> IterableIter
67
- {
68
- match & * self . value {
69
- Value :: PersistentList ( plist) => IterableIter :: PersistentList ( Rc :: new ( plist. clone ( ) ) . iter ( ) ) ,
70
- Value :: PersistentVector ( pvector) => IterableIter :: PersistentVector ( Rc :: new ( pvector. clone ( ) ) . iter ( ) ) ,
71
- Value :: PersistentListMap ( pmap) => IterableIter :: PersistentListMap ( Rc :: new ( pmap. clone ( ) ) . iter ( ) ) ,
72
+ pub fn iter ( & self ) -> IterableIter {
73
+ match & * self . value {
74
+ Value :: PersistentList ( plist) => {
75
+ IterableIter :: PersistentList ( Rc :: new ( plist. clone ( ) ) . iter ( ) )
76
+ }
77
+ Value :: PersistentVector ( pvector) => {
78
+ IterableIter :: PersistentVector ( Rc :: new ( pvector. clone ( ) ) . iter ( ) )
79
+ }
80
+ Value :: PersistentListMap ( pmap) => {
81
+ IterableIter :: PersistentListMap ( Rc :: new ( pmap. clone ( ) ) . iter ( ) )
82
+ }
72
83
// We are ok panicking in this case because an invariant on the type is the assumption
73
- // that we only have an Iterable if we were able to convert
74
- _ => panic ! ( "Called Iterable iter on non-iterable" )
84
+ // that we only have an Iterable if we were able to convert
85
+ _ => panic ! ( "Called Iterable iter on non-iterable" ) ,
75
86
}
76
-
77
87
}
78
88
}
0 commit comments