Skip to content

Commit 3d7bfb7

Browse files
committed
Implement the 'reverse' option for sorted()
1 parent 468ce7d commit 3d7bfb7

File tree

4 files changed

+30
-8
lines changed

4 files changed

+30
-8
lines changed

runtime/builtin_types.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,7 @@ func builtinRepr(f *Frame, args Args, kwargs KWArgs) (*Object, *BaseException) {
570570
return s.ToObject(), nil
571571
}
572572

573-
func builtinSorted(f *Frame, args Args, _ KWArgs) (*Object, *BaseException) {
573+
func builtinSorted(f *Frame, args Args, kwargs KWArgs) (*Object, *BaseException) {
574574
// TODO: Support (cmp=None, key=None, reverse=False)
575575
if raised := checkFunctionArgs(f, "sorted", args, ObjectType); raised != nil {
576576
return nil, raised
@@ -580,6 +580,14 @@ func builtinSorted(f *Frame, args Args, _ KWArgs) (*Object, *BaseException) {
580580
return nil, raised
581581
}
582582
toListUnsafe(result).Sort(f)
583+
// Implement reverse.
584+
reverse, raised := IsTrue(f, kwargs.get("reverse", None))
585+
if raised != nil {
586+
return nil, raised
587+
}
588+
if reverse {
589+
toListUnsafe(result).Reverse()
590+
}
583591
return result, nil
584592
}
585593

runtime/builtin_types_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,11 @@ func TestBuiltinFuncs(t *testing.T) {
256256
{f: "sorted", args: wrapArgs(newTestDict("foo", 1, "bar", 2)), want: newTestList("bar", "foo").ToObject()},
257257
{f: "sorted", args: wrapArgs(1), wantExc: mustCreateException(TypeErrorType, "'int' object is not iterable")},
258258
{f: "sorted", args: wrapArgs(newTestList("foo", "bar"), 2), wantExc: mustCreateException(TypeErrorType, "'sorted' requires 1 arguments")},
259+
{f: "sorted", args: wrapArgs(newTestList(1, 2, 0, 3)), kwargs: wrapKWArgs("reverse", False), want: newTestRange(4).ToObject()},
260+
{f: "sorted", args: wrapArgs(newTestList(1, 2, 0, 3)), kwargs: wrapKWArgs("reverse", 0), want: newTestRange(4).ToObject()},
261+
{f: "sorted", args: wrapArgs(newTestList(1, 2, 0, 3)), kwargs: wrapKWArgs("reverse", None), want: newTestRange(4).ToObject()},
262+
{f: "sorted", args: wrapArgs(newTestList(1, 2, 0, 3)), kwargs: wrapKWArgs("reverse", True), want: newTestList(3, 2, 1, 0).ToObject()},
263+
{f: "sorted", args: wrapArgs(newTestList(1, 2, 0, 3)), kwargs: wrapKWArgs("reverse", 1), want: newTestList(3, 2, 1, 0).ToObject()},
259264
{f: "unichr", args: wrapArgs(0), want: NewUnicode("\x00").ToObject()},
260265
{f: "unichr", args: wrapArgs(65), want: NewStr("A").ToObject()},
261266
{f: "unichr", args: wrapArgs(0x120000), wantExc: mustCreateException(ValueErrorType, "unichr() arg not in range(0x10ffff)")},

runtime/list.go

+13-7
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,18 @@ func (l *List) Append(o *Object) {
6161
l.mutex.Unlock()
6262
}
6363

64+
// Reverse the list in place.
65+
func (l *List) Reverse() {
66+
l.mutex.Lock()
67+
halfLen := len(l.elems) / 2
68+
for i := 0; i < halfLen; i++ {
69+
j := len(l.elems) - i - 1
70+
l.elems[i], l.elems[j] = l.elems[j], l.elems[i]
71+
}
72+
l.mutex.Unlock()
73+
}
74+
75+
6476
// SetItem sets the index'th element of l to value.
6577
func (l *List) SetItem(f *Frame, index int, value *Object) *BaseException {
6678
l.mutex.RLock()
@@ -354,13 +366,7 @@ func listReverse(f *Frame, args Args, _ KWArgs) (*Object, *BaseException) {
354366
return nil, raised
355367
}
356368
l := toListUnsafe(args[0])
357-
l.mutex.Lock()
358-
halfLen := len(l.elems) / 2
359-
for i := 0; i < halfLen; i++ {
360-
j := len(l.elems) - i - 1
361-
l.elems[i], l.elems[j] = l.elems[j], l.elems[i]
362-
}
363-
l.mutex.Unlock()
369+
l.Reverse()
364370
return None, nil
365371
}
366372

testing/builtin_test.py

+3
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,9 @@ def __init__(self, x):
254254
assert sorted(["a", "e", "c", "b"]) == ["a", "b", "c", "e"]
255255
assert sorted((3, 1, 5, 2, 4)) == [1, 2, 3, 4, 5]
256256
assert sorted({"foo": 1, "bar": 2}) == ["bar", "foo"]
257+
assert sorted([1, 2], reverse=True) == [2, 1]
258+
assert sorted([1, 2], reverse=42) == [2, 1]
259+
assert sorted([1, 2], reverse=0) == [1, 2]
257260

258261
# Test zip
259262

0 commit comments

Comments
 (0)