diff --git a/benchmark/index.ts b/benchmark/index.ts index 1bf298b..6464cd6 100644 --- a/benchmark/index.ts +++ b/benchmark/index.ts @@ -18,6 +18,20 @@ function suite(tzid: string) { set.all(); }), + b.add('...RRuleSet (rust)', () => { + const rrule = new rust.RRule({ + frequency: rust.Frequency.Daily, + count: 30, + interval: 1, + }); + const set = new rust.RRuleSet({ + dtstart: rust.DateTime.create(2023, 2, 21, 23, 59, 0, false), + tzid, + rrules: [rrule], + }); + + [...set]; + }), b.add('RRule.all() (node)', () => { const rrule = new node.RRule({ freq: node.RRule.DAILY, diff --git a/lib/js/rrule_set.rs b/lib/js/rrule_set.rs index 540322f..44b52ff 100644 --- a/lib/js/rrule_set.rs +++ b/lib/js/rrule_set.rs @@ -5,7 +5,6 @@ use crate::rrule::exdate::ExDate; use crate::rrule::rdate::RDate; use crate::rrule::{rrule, rrule_set}; use napi::bindgen_prelude::{Array, Reference, SharedReference}; -use napi::iterator::Generator; use napi::Env; use napi_derive::napi; use replace_with::replace_with_or_abort_and_return; @@ -286,18 +285,15 @@ impl RRuleSetIterator { } } -#[napi(iterator)] +#[napi] pub struct RRuleSetIteratorIterable { iterator: SharedReference>, } #[napi] -impl Generator for RRuleSetIteratorIterable { - type Yield = i64; - type Next = (); - type Return = (); - - fn next(&mut self, _next: Option) -> Option { +impl RRuleSetIteratorIterable { + #[napi] + pub fn next(&mut self) -> Option { self.iterator.next().map(|date: DateTime| (&date).into()) } } diff --git a/src/lib/index.d.ts b/src/lib/index.d.ts index 9de7a91..b85822e 100644 --- a/src/lib/index.d.ts +++ b/src/lib/index.d.ts @@ -77,5 +77,5 @@ export class RRuleSetIterator { iterator(): RRuleSetIteratorIterable } export class RRuleSetIteratorIterable { - [Symbol.iterator](): Iterator + next(): number | null } diff --git a/src/rrule-set.ts b/src/rrule-set.ts index f5acfaf..6f7cb3f 100644 --- a/src/rrule-set.ts +++ b/src/rrule-set.ts @@ -235,19 +235,22 @@ export class RRuleSet implements Iterable { } public [Symbol.iterator]() { - const iter = this.toRust().iterator().iterator()[Symbol.iterator](); + const iter = this.toRust().iterator().iterator(); return { next: () => { const result = iter.next(); - if (result.done) { - return result; + if (result === null) { + return { + done: true as const, + value: undefined, + }; } return { done: false, - value: DateTime.fromNumeric(result.value), + value: DateTime.fromNumeric(result), }; }, };