Author: pmichaud
Date: Sun Nov 9 20:22:09 2008
New Revision: 32476
Modified:
trunk/languages/perl6/src/classes/List.pir
Log:
[rakudo]: Update .uniq method for List (bacek++, RT #55484)
* Patch courtesy Vasily Chekalkin <bacek at bacek.com>, with modifications
Modified: trunk/languages/perl6/src/classes/List.pir
==============================================================================
--- trunk/languages/perl6/src/classes/List.pir (original)
+++ trunk/languages/perl6/src/classes/List.pir Sun Nov 9 20:22:09 2008
@@ -538,48 +538,59 @@
# TODO Rewrite it. It's too naive.
.namespace ['List']
-.sub uniq :method
- .local pmc ulist
- .local pmc key
- .local pmc val
- .local pmc uval
- .local int len
- .local int i
- .local int ulen
- .local int ui
-
- ulist = new 'List'
- len = self.'elems'()
- i = 0
-
- loop:
- if i == len goto done
-
- val = self[i]
+.sub 'uniq' :method
+ .param pmc comparer :optional
+ .param int has_comparer :opt_flag
+
+ if has_comparer goto have_comparer
+ comparer = get_hll_global 'infix:eq'
+ have_comparer:
- ui = 0
- ulen = ulist.'elems'()
- inner_loop:
- if ui == ulen goto inner_loop_done
-
- uval = ulist[ui]
- if uval == val goto found
-
- inc ui
- goto inner_loop
- inner_loop_done:
+ .local pmc ulist
+ $P0 = get_hll_global 'List'
+ ulist = $P0.'new'()
+ .local int lelems, uelems, l, u
+ lelems = self.'elems'()
+ uelems = 0
+ l = 0
+ outer_loop:
+ unless l < lelems goto outer_done
+ .local pmc val
+ val = self[l]
+ u = 0
+ inner_loop:
+ unless u < uelems goto inner_done
+ $P0 = ulist[u]
+ $P0 = comparer(val, $P0)
+ if $P0 goto outer_next
+ inc u
+ goto inner_loop
+ inner_done:
ulist.'push'(val)
+ inc uelems
+ outer_next:
+ inc l
+ goto outer_loop
+ outer_done:
+ .return (ulist)
+.end
- found:
- inc i
- goto loop
+.namespace []
+.sub 'uniq' :multi(Sub)
+ .param pmc comparer
+ .param pmc values :slurpy
+ .return values.'uniq'(comparer)
+.end
- done:
- .return(ulist)
+.sub 'uniq' :multi()
+ .param pmc values :slurpy
+ .return values.'uniq'()
.end
+
+.namespace ['List']
=item values()