From a7214ac28c5c7c47932f1e76a15c8707524f964d Mon Sep 17 00:00:00 2001 From: Moritz Lenz Date: Sun, 8 Mar 2009 15:51:56 +0100 Subject: [PATCH] re-implement List.min in Perl 6; Patch courtesy by bacek++ Closes RT #63712 --- src/builtins/any-list.pir | 47 --------------------------------------- src/setting/Any-list.pm | 19 ++++++++++++++++ 2 files changed, 19 insertions(+), 47 deletions(-) diff --git a/src/builtins/any-list.pir b/src/builtins/any-list.pir index 46f94441fa3..a61edd56a3b 100644 --- a/src/builtins/any-list.pir +++ b/src/builtins/any-list.pir @@ -168,53 +168,6 @@ Return a List with the keys of the invocant. .return (result) .end -=item min - -=cut - -.namespace [] -.sub 'min' :multi() - .param pmc values :slurpy - .local pmc by - by = get_hll_global 'infix:cmp' - unless values goto have_by - $P0 = values[0] - $I0 = isa $P0, 'Sub' - unless $I0 goto have_by - by = shift values - have_by: - .tailcall values.'min'(by) -.end - - -.namespace ['Any'] -.sub 'min' :method :multi(_) - .param pmc by :optional - .param int has_by :opt_flag - if has_by goto have_by - by = get_hll_global 'infix:cmp' - have_by: - - .local pmc it, result - $P0 = self.'list'() - it = $P0.'iterator'() - unless it goto fail - result = shift it - loop: - unless it goto done - $P0 = shift it - $I0 = by($P0, result) - unless $I0 < 0 goto loop - result = $P0 - goto loop - fail: - .local num failres - failres = "+Inf" - .return (failres) - done: - .return (result) -.end - .namespace [] .sub 'max' :multi() diff --git a/src/setting/Any-list.pm b/src/setting/Any-list.pm index 1a6fd2983ba..5db14b1014a 100644 --- a/src/setting/Any-list.pm +++ b/src/setting/Any-list.pm @@ -22,6 +22,20 @@ class Any is also { ($value,).map: &expr } + # RT #63700 - parse failed on &infix: + our Array multi method min( $values: Code $by = sub { $^a cmp $^b } ) { + my @list = $values.list; + return +Inf unless @list.elems; + my $res = @list.shift; + for @list -> $x { + if (&$by($res, $x) > 0) { + $res = $x; + } + } + $res; + }; + + our List multi method pairs(@values: *@indices) { gather { for (@values.keys Z @values) -> $key, $val is rw { @@ -44,4 +58,9 @@ our List multi pairs(@values, *@indices) { @values.pairs(@indices) } +our List multi min(*@values) { + my $by = @values[0] ~~ Code ?? shift @values !! sub { $^a cmp $^b }; + @values.min($by); +} + # vim: ft=perl6