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 ;
61use crate :: persistent_list:: PersistentListIter ;
7- use crate :: persistent_list_map:: ToPersistentListMapIter ;
8- use crate :: persistent_vector:: ToPersistentVectorIter ;
92use crate :: persistent_list:: ToPersistentListIter ;
3+ use crate :: persistent_list_map:: PersistentListMapIter ;
4+ use crate :: persistent_list_map:: ToPersistentListMapIter ;
5+ use crate :: persistent_vector:: PersistentVectorIter ;
106use 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 ;
1211use std:: iter:: FromIterator ;
12+ use std:: rc:: Rc ;
1313
1414//
1515// This Protocol lives inside of Clojure RS
1616//
17- #[ derive( Debug , Clone ) ]
17+ #[ derive( Debug , Clone ) ]
1818pub struct Iterable {
19- value : Rc < Value >
19+ value : Rc < Value > ,
2020}
2121impl Protocol for Iterable {
2222 fn try_as_protocol ( val : & Rc < Value > ) -> Option < Self > {
2323 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 ,
3234 }
3335 }
3436 fn try_unwrap ( & self ) -> Option < Rc < Value > > {
3537 match & * self . value {
3638 Value :: PersistentList ( _) => Some ( Rc :: clone ( & self . value ) ) ,
3739 Value :: PersistentVector ( _) => Some ( Rc :: clone ( & self . value ) ) ,
3840 Value :: PersistentListMap ( _) => Some ( Rc :: clone ( & self . value ) ) ,
39- _ => None
41+ _ => None ,
4042 }
41- }
43+ }
4244}
4345pub enum IterableIter {
4446 PersistentList ( PersistentListIter ) ,
@@ -55,24 +57,32 @@ impl Iterator for IterableIter {
5557 let maybe_map_entry = plist_map_iter. next ( ) ;
5658 if let Some ( map_entry) = maybe_map_entry {
5759 // 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+ ) ;
5965 }
60- None
66+ None
6167 }
6268 }
6369 }
6470}
6571impl 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+ }
7283 // 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" ) ,
7586 }
76-
7787 }
7888}
0 commit comments