From cfb655bc71a75f7c6c81c49aa4acb2dcf8e801f4 Mon Sep 17 00:00:00 2001 From: Elizabeth Mattijsen Date: Tue, 31 Dec 2019 17:20:18 +0100 Subject: [PATCH] Streamline Supply.elems Into 2 separate multi methods, one for the timed version, and one for the version that doesn't use time. Also use nqp::op for time keeping to reduce timing overhead. --- src/core.c/Supply.pm6 | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/core.c/Supply.pm6 b/src/core.c/Supply.pm6 index 933b357de92..e752829e7db 100644 --- a/src/core.c/Supply.pm6 +++ b/src/core.c/Supply.pm6 @@ -1121,24 +1121,29 @@ my class Supply does Awaitable { } } - method elems(Supply:D: $seconds? ) { + multi method elems(Supply:D:) { supply { - my int $elems = 0; - if $seconds { - my $last_time = time div $seconds; - my int $last_elems = $elems; - whenever self -> \val { - $last_elems = $elems = $elems + 1; - my $this_time = time div $seconds; - if $this_time != $last_time { - emit $elems; - $last_time = $this_time; - } - LAST emit($elems) if $elems != $last_elems; + my int $elems; + whenever self { emit ++$elems } + } + } + multi method elems(Supply:D: $seconds ) { + supply { + my $last-time := nqp::time_i() div $seconds; + my $this-time; + + my int $elems; + my int $last-elems; + + whenever self { + $last-elems = ++$elems; + $this-time := nqp::time_i() div $seconds; + + if $this-time != $last-time { + emit $elems; + $last-time := $this-time; } - } - else { - whenever self -> \val { emit $elems = $elems + 1 } + LAST emit $elems if $elems != $last-elems; } } }