# New Ticket Created by  Vasily Chekalkin 
# Please include the string:  [perl #63712]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=63712 >


---
 src/builtins/any-list.pir |   47 ---------------------------------------------
 src/setting/Any-list.pm   |   20 ++++++++++++++++++-
 2 files changed, 19 insertions(+), 48 deletions(-)

diff --git a/src/builtins/any-list.pir b/src/builtins/any-list.pir
index b87666b..bc5cc9e 100644
--- a/src/builtins/any-list.pir
+++ b/src/builtins/any-list.pir
@@ -223,53 +223,6 @@ Return a List with the keys of the invocant.
     .return(res)
 .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 5758dce..0aaeccc 100644
--- a/src/setting/Any-list.pm
+++ b/src/setting/Any-list.pm
@@ -23,7 +23,20 @@ class Any is also {
             $res = &$expression($res, |@args);
         }
         $res;
-    }
+    };
+
+    # RT #63700 - parse failed on &infix:<cmp>
+    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 grep(Code $test, *...@values) {
@@ -34,4 +47,9 @@ multi reduce ( Code $expression ;; *...@values ) {
     @values.reduce($expression);
 }
 
+our List multi min(*...@values) {
+    my $by = @values[0] ~~ Code ?? shift @values !! sub { $^a cmp $^b };
+    @values.min($by);
+}
+
 # vim: ft=perl6

Reply via email to