@@ -1025,6 +1025,7 @@ extern "C" {
1025
1025
///
1026
1026
/// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols)
1027
1027
#[ derive( Clone , Debug ) ]
1028
+ #[ wasm_bindgen( is_type_of = Iterator :: looks_like_iterator) ]
1028
1029
pub type Iterator ;
1029
1030
1030
1031
/// The next method always has to return an object with appropriate
@@ -1035,6 +1036,26 @@ extern "C" {
1035
1036
pub fn next ( this : & Iterator ) -> Result < IteratorNext , JsValue > ;
1036
1037
}
1037
1038
1039
+ impl Iterator {
1040
+ fn looks_like_iterator ( it : & JsValue ) -> bool {
1041
+ #[ wasm_bindgen]
1042
+ extern "C" {
1043
+ type MaybeIterator ;
1044
+
1045
+ #[ wasm_bindgen( method, getter) ]
1046
+ fn next ( this : & MaybeIterator ) -> JsValue ;
1047
+ }
1048
+
1049
+ if !it. is_object ( ) {
1050
+ return false ;
1051
+ }
1052
+
1053
+ let it = it. unchecked_ref :: < MaybeIterator > ( ) ;
1054
+
1055
+ it. next ( ) . is_function ( )
1056
+ }
1057
+ }
1058
+
1038
1059
/// An iterator over the JS `Symbol.iterator` iteration protocol.
1039
1060
///
1040
1061
/// Use the `IntoIterator for &js_sys::Iterator` implementation to create this.
@@ -1123,37 +1144,20 @@ impl IterState {
1123
1144
/// Create an iterator over `val` using the JS iteration protocol and
1124
1145
/// `Symbol.iterator`.
1125
1146
pub fn try_iter ( val : & JsValue ) -> Result < Option < IntoIter > , JsValue > {
1126
- #[ wasm_bindgen]
1127
- extern "C" {
1128
- type MaybeIterator ;
1129
-
1130
- #[ wasm_bindgen( method, getter) ]
1131
- fn next ( this : & MaybeIterator ) -> JsValue ;
1132
- }
1133
-
1134
1147
let iter_sym = Symbol :: iterator ( ) ;
1135
1148
let iter_fn = Reflect :: get ( val, iter_sym. as_ref ( ) ) ?;
1136
- if !iter_fn. is_function ( ) {
1137
- return Ok ( None ) ;
1138
- }
1139
1149
1140
1150
let iter_fn: Function = match iter_fn. dyn_into ( ) {
1141
1151
Ok ( iter_fn) => iter_fn,
1142
- Err ( _) => return Ok ( None )
1152
+ Err ( _) => return Ok ( None ) ,
1143
1153
} ;
1144
- let it = iter_fn. call0 ( val) ?;
1145
- if !it. is_object ( ) {
1146
- return Ok ( None ) ;
1147
- }
1148
1154
1149
- let next = it. unchecked_ref :: < MaybeIterator > ( ) . next ( ) ;
1155
+ let it: Iterator = match iter_fn. call0 ( val) ?. dyn_into ( ) {
1156
+ Ok ( it) => it,
1157
+ Err ( _) => return Ok ( None ) ,
1158
+ } ;
1150
1159
1151
- Ok ( if next. is_function ( ) {
1152
- let it: Iterator = it. unchecked_into ( ) ;
1153
- Some ( it. into_iter ( ) )
1154
- } else {
1155
- None
1156
- } )
1160
+ Ok ( Some ( it. into_iter ( ) ) )
1157
1161
}
1158
1162
1159
1163
// IteratorNext
0 commit comments