Skip to content

Commit 8d8c0ed

Browse files
authored
Add sort! for unfrozen LittleDict (#136)
Also test sort & sort! more systematically and consistently between LittleDict and OrderedDict
1 parent 3ec011e commit 8d8c0ed

File tree

3 files changed

+44
-6
lines changed

3 files changed

+44
-6
lines changed

src/dict_sorting.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,17 @@ function sort!(s::OrderedSet; kwargs...)
3131
return s
3232
end
3333

34+
function sort!(d::UnfrozenLittleDict; byvalue::Bool=false, args...)
35+
if byvalue
36+
p = sortperm(d.vals; args...)
37+
else
38+
p = sortperm(d.keys; args...)
39+
end
40+
permute!(d.keys, p)
41+
permute!(d.vals, p)
42+
return d
43+
end
44+
3445
sort(d::Union{OrderedDict,OrderedSet}; args...) = sort!(copy(d); args...)
3546

3647
@deprecate sort(d::Dict; args...) sort!(OrderedDict(d); args...)

test/test_little_dict.jl

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -495,16 +495,29 @@ using OrderedCollections: FrozenLittleDict, UnfrozenLittleDict
495495
end
496496

497497
@testset "Sorting" begin
498-
d = LittleDict(i=>Char(123-i) for i in [4, 8, 1, 7, 9, 3, 10, 2, 6, 5])
498+
ks = [4, 8, 1, 7, 9, 3, 10, 2, 6, 5]
499+
d = LittleDict(i=>Char(123-i) for i in ks)
499500

500-
@test collect(keys(d)) != 1:10
501501
sd = sort(d)
502+
@test collect(keys(d)) == ks # verify d is not changed by sort()
502503
@test collect(keys(sd)) == 1:10
503504
@test collect(values(sd)) == collect('z':-1:'q')
504505
@test sort(sd) == sd
506+
505507
sdv = sort(d; byvalue=true)
508+
@test collect(keys(d)) == ks # verify d is not changed by sort()
506509
@test collect(keys(sdv)) == 10:-1:1
507510
@test collect(values(sdv)) == collect('q':'z')
511+
512+
sort!(d)
513+
@test collect(keys(d)) == 1:10
514+
@test collect(values(d)) == collect('z':-1:'q')
515+
@test sort(d) == d == sd
516+
517+
sort!(d; byvalue=true)
518+
@test collect(keys(d)) == 10:-1:1
519+
@test collect(values(d)) == collect('q':'z')
520+
@test sort(d) == d == sd
508521
end
509522

510523
@testset "Test that LittleDict merge with combiner returns type LittleDict" begin

test/test_ordered_dict.jl

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -421,15 +421,29 @@ using OrderedCollections, Test
421421
end
422422

423423
@testset "Sorting" begin
424-
d = Dict(i=>Char(123-i) for i = 1:10)
425-
@test collect(keys(d)) != 1:10
426-
sd = sort!(OrderedDict(d))
424+
ks = [4, 8, 1, 7, 9, 3, 10, 2, 6, 5]
425+
d = OrderedDict(i=>Char(123-i) for i in ks)
426+
427+
sd = sort(d)
428+
@test collect(keys(d)) == ks # verify d is not changed by sort()
427429
@test collect(keys(sd)) == 1:10
428430
@test collect(values(sd)) == collect('z':-1:'q')
429431
@test sort(sd) == sd
430-
sdv = sort!(OrderedDict(d); byvalue=true)
432+
433+
sdv = sort(d; byvalue=true)
434+
@test collect(keys(d)) == ks # verify d is not changed by sort()
431435
@test collect(keys(sdv)) == 10:-1:1
432436
@test collect(values(sdv)) == collect('q':'z')
437+
438+
sort!(d)
439+
@test collect(keys(d)) == 1:10
440+
@test collect(values(d)) == collect('z':-1:'q')
441+
@test sort(d) == d == sd
442+
443+
sort!(d; byvalue=true)
444+
@test collect(keys(d)) == 10:-1:1
445+
@test collect(values(d)) == collect('q':'z')
446+
@test sort(d) == d == sd
433447
end
434448

435449
@testset "Test that OrderedDict merge with combiner returns type OrderedDict" begin

0 commit comments

Comments
 (0)