Skip to content

Commit 75d62da

Browse files
authored
Merge pull request #102 from alanjds/sorted-reverse
Sorted reverse
2 parents 24f810b + da6b9af commit 75d62da

File tree

4 files changed

+29
-8
lines changed

4 files changed

+29
-8
lines changed

grumpy-runtime-src/runtime/builtin_types.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -669,7 +669,7 @@ func builtinSetAttr(f *Frame, args Args, _ KWArgs) (*Object, *BaseException) {
669669
return None, SetAttr(f, args[0], toStrUnsafe(args[1]), args[2])
670670
}
671671

672-
func builtinSorted(f *Frame, args Args, _ KWArgs) (*Object, *BaseException) {
672+
func builtinSorted(f *Frame, args Args, kwargs KWArgs) (*Object, *BaseException) {
673673
// TODO: Support (cmp=None, key=None, reverse=False)
674674
if raised := checkFunctionArgs(f, "sorted", args, ObjectType); raised != nil {
675675
return nil, raised
@@ -679,6 +679,14 @@ func builtinSorted(f *Frame, args Args, _ KWArgs) (*Object, *BaseException) {
679679
return nil, raised
680680
}
681681
toListUnsafe(result).Sort(f)
682+
// Implement reverse.
683+
reverse, raised := IsTrue(f, kwargs.get("reverse", None))
684+
if raised != nil {
685+
return nil, raised
686+
}
687+
if reverse {
688+
toListUnsafe(result).Reverse()
689+
}
682690
return result, nil
683691
}
684692

grumpy-runtime-src/runtime/builtin_types_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,11 @@ func TestBuiltinFuncs(t *testing.T) {
328328
{f: "sorted", args: wrapArgs(newTestDict("foo", 1, "bar", 2)), want: newTestList("bar", "foo").ToObject()},
329329
{f: "sorted", args: wrapArgs(1), wantExc: mustCreateException(TypeErrorType, "'int' object is not iterable")},
330330
{f: "sorted", args: wrapArgs(newTestList("foo", "bar"), 2), wantExc: mustCreateException(TypeErrorType, "'sorted' requires 1 arguments")},
331+
{f: "sorted", args: wrapArgs(newTestList(1, 2, 0, 3)), kwargs: wrapKWArgs("reverse", False), want: newTestRange(4).ToObject()},
332+
{f: "sorted", args: wrapArgs(newTestList(1, 2, 0, 3)), kwargs: wrapKWArgs("reverse", 0), want: newTestRange(4).ToObject()},
333+
{f: "sorted", args: wrapArgs(newTestList(1, 2, 0, 3)), kwargs: wrapKWArgs("reverse", None), want: newTestRange(4).ToObject()},
334+
{f: "sorted", args: wrapArgs(newTestList(1, 2, 0, 3)), kwargs: wrapKWArgs("reverse", True), want: newTestList(3, 2, 1, 0).ToObject()},
335+
{f: "sorted", args: wrapArgs(newTestList(1, 2, 0, 3)), kwargs: wrapKWArgs("reverse", 1), want: newTestList(3, 2, 1, 0).ToObject()},
331336
{f: "sum", args: wrapArgs(newTestList(1, 2, 3, 4)), want: NewInt(10).ToObject()},
332337
{f: "sum", args: wrapArgs(newTestList(1, 2), 3), want: NewFloat(6).ToObject()},
333338
{f: "sum", args: wrapArgs(newTestList(2, 1.1)), want: NewFloat(3.1).ToObject()},

grumpy-runtime-src/runtime/list.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,17 @@ 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+
6475
// DelItem removes the index'th element of l.
6576
func (l *List) DelItem(f *Frame, index int) *BaseException {
6677
l.mutex.Lock()
@@ -485,13 +496,7 @@ func listReverse(f *Frame, args Args, _ KWArgs) (*Object, *BaseException) {
485496
return nil, raised
486497
}
487498
l := toListUnsafe(args[0])
488-
l.mutex.Lock()
489-
halfLen := len(l.elems) / 2
490-
for i := 0; i < halfLen; i++ {
491-
j := len(l.elems) - i - 1
492-
l.elems[i], l.elems[j] = l.elems[j], l.elems[i]
493-
}
494-
l.mutex.Unlock()
499+
l.Reverse()
495500
return None, nil
496501
}
497502

grumpy-runtime-src/testing/builtin_test.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,9 @@ class Foo(object):
310310
assert sorted(["a", "e", "c", "b"]) == ["a", "b", "c", "e"]
311311
assert sorted((3, 1, 5, 2, 4)) == [1, 2, 3, 4, 5]
312312
assert sorted({"foo": 1, "bar": 2}) == ["bar", "foo"]
313+
assert sorted([1, 2], reverse=True) == [2, 1]
314+
assert sorted([1, 2], reverse=42) == [2, 1]
315+
assert sorted([1, 2], reverse=0) == [1, 2]
313316

314317
# Test zip
315318

0 commit comments

Comments
 (0)