sorting 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +8 -8
- data/documentation/examples.rb +38 -0
- data/lib/sorting.rb +28 -10
- data/lib/sorting/ascending.rb +6 -2
- data/lib/sorting/bigger.rb +5 -0
- data/lib/sorting/convenience.rb +24 -3
- data/lib/sorting/descending.rb +8 -4
- data/lib/sorting/helpers.rb +49 -8
- data/lib/sorting/smaller.rb +5 -0
- data/lib/sorting/version.rb +4 -1
- data/sorting.gemspec +4 -4
- metadata +3 -2
data/README.markdown
CHANGED
@@ -27,6 +27,14 @@ Sort a list of Person objects
|
|
27
27
|
[Sorting.asc(person.first_name), Sorting.asc(person.last_name), Sorting.desc(person.age)]
|
28
28
|
}
|
29
29
|
|
30
|
+
# Care about expensive comparison values which may not always be needed
|
31
|
+
# assume item.expensive_value takes a lot of time to compute, but since it's the second value,
|
32
|
+
# it might only be needed in a small number of cases.
|
33
|
+
require 'sorting/convenience'
|
34
|
+
items.sort_by { |item|
|
35
|
+
[asc(item.cheap_value), asc(:nils_last) { item.expensive_value }]
|
36
|
+
}
|
37
|
+
|
30
38
|
# Care about nil values in your data
|
31
39
|
require 'sorting/convenience'
|
32
40
|
people.sort_by { |person|
|
@@ -36,14 +44,6 @@ Sort a list of Person objects
|
|
36
44
|
# Only care about nil values in your data
|
37
45
|
[5,3,nil,9].sort_by { |x| x || Sorting::Bigger } # Sorting::Smaller is available too
|
38
46
|
|
39
|
-
# Care about expensive comparison values which may not always be needed
|
40
|
-
# assume item.expensive_value takes a lot of time to compute, but since it's the second value,
|
41
|
-
# it might only be needed in a small number of cases.
|
42
|
-
require 'sorting/convenience'
|
43
|
-
items.sort_by { |item|
|
44
|
-
[asc(item.cheap_value), asc(:nils_last) { item.expensive_value }]
|
45
|
-
}
|
46
|
-
|
47
47
|
Take a look at {file:documentation/examples.rb} for more examples.
|
48
48
|
|
49
49
|
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'sorting/convenience'
|
5
|
+
rescue LoadError
|
6
|
+
$LOAD_PATH << (p File.expand_path('../../lib', __FILE__))
|
7
|
+
require 'sorting/convenience'
|
8
|
+
puts "Sorting gem is not installed, using relative lib"
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
require 'pp'
|
13
|
+
Person = Struct.new(:first_name, :last_name, :age)
|
14
|
+
people = [
|
15
|
+
Person.new('Peter', 'Pan', 15),
|
16
|
+
Person.new('Peter', 'Parker', 15),
|
17
|
+
Person.new('Peter', 'Pan', 23),
|
18
|
+
]
|
19
|
+
pp people.sort_by { |person| [asc(person.first_name), asc(person.last_name), desc(person.age)] }
|
20
|
+
|
21
|
+
|
22
|
+
Foo = Struct.new(:a, :b, :c)
|
23
|
+
calc = proc { |s,x| sleep(s); x }
|
24
|
+
foos = [
|
25
|
+
Foo.new(1,2,1),
|
26
|
+
Foo.new(1,2,2),
|
27
|
+
Foo.new(1,3,4),
|
28
|
+
Foo.new(2,3,4),
|
29
|
+
]
|
30
|
+
start = Time.now
|
31
|
+
pp foos.sort_by { |x| [asc(x.a), desc(calc[0.1, x.b]), asc(calc[0.2, x.c])] }
|
32
|
+
stop = Time.now
|
33
|
+
printf "Elapsed: %.2fs\n", stop-start
|
34
|
+
|
35
|
+
start = Time.now
|
36
|
+
pp foos.sort_by { |x| [asc(x.a), desc { calc[0.1, x.b] }, asc { calc[0.2, x.c] }] }
|
37
|
+
stop = Time.now
|
38
|
+
printf "Elapsed: %.2fs\n", stop-start
|
data/lib/sorting.rb
CHANGED
@@ -14,6 +14,9 @@ require 'sorting/version'
|
|
14
14
|
# Sorting
|
15
15
|
# Helpful functionality for sorting and comparing.
|
16
16
|
#
|
17
|
+
# Requiring 'sorting' loads all functionality this gem provides, except for the
|
18
|
+
# patches on Kernel. For those you must `require 'sorting/convenience'`.
|
19
|
+
#
|
17
20
|
# @example Convenient
|
18
21
|
# require 'sorting/convenience'
|
19
22
|
# people.sort_by { |person| [asc(person.first_name), asc(person.last_name), desc(person.age)] }
|
@@ -24,6 +27,14 @@ require 'sorting/version'
|
|
24
27
|
# [Sorting.asc(person.first_name), Sorting.asc(person.last_name), Sorting.desc(person.age)]
|
25
28
|
# }
|
26
29
|
#
|
30
|
+
# @example Care about expensive comparison values which may not always be needed
|
31
|
+
# # assume item.expensive_value takes a lot of time to compute, but since it's the second value,
|
32
|
+
# # it might only be needed in a small number of cases.
|
33
|
+
# require 'sorting/convenience'
|
34
|
+
# items.sort_by { |item|
|
35
|
+
# [asc(item.cheap_value), asc(:nils_last) { item.expensive_value }]
|
36
|
+
# }
|
37
|
+
#
|
27
38
|
# @example Care about nil values in your data
|
28
39
|
# require 'sorting/convenience'
|
29
40
|
# people.sort_by { |person|
|
@@ -33,15 +44,22 @@ require 'sorting/version'
|
|
33
44
|
# @example Only care about nil values in your data
|
34
45
|
# [5,3,nil,9].sort_by { |x| x || Sorting::Bigger } # Sorting::Smaller is available too
|
35
46
|
#
|
36
|
-
# @example Care about expensive comparison values which may not always be needed
|
37
|
-
# # assume item.expensive_value takes a lot of time to compute, but since it's the second value,
|
38
|
-
# # it might only be needed in a small number of cases.
|
39
|
-
# require 'sorting/convenience'
|
40
|
-
# items.sort_by { |item|
|
41
|
-
# [asc(item.cheap_value), asc(:nils_last) { item.expensive_value }]
|
42
|
-
# }
|
43
|
-
#
|
44
47
|
module Sorting
|
45
|
-
|
46
|
-
|
48
|
+
Sorting::Helpers.append_to(self) # can't use include, see Sorting::Helpers.append_to
|
49
|
+
|
50
|
+
# @!method asc(*args, &lazy)
|
51
|
+
# @!scope class
|
52
|
+
# @see Sorting::Helpers.asc
|
53
|
+
#
|
54
|
+
# @note
|
55
|
+
# This method is a module function, and as such also available as a
|
56
|
+
# private instance method.
|
57
|
+
|
58
|
+
# @!method desc(*args, &lazy)
|
59
|
+
# @!scope class
|
60
|
+
# @see Sorting::Helpers.desc
|
61
|
+
#
|
62
|
+
# @note
|
63
|
+
# This method is a module function, and as such also available as a
|
64
|
+
# private instance method.
|
47
65
|
end
|
data/lib/sorting/ascending.rb
CHANGED
@@ -14,12 +14,16 @@ module Sorting
|
|
14
14
|
# Sorting::Helpers is a module which provides you with a convenient .asc
|
15
15
|
# forwarding method
|
16
16
|
#
|
17
|
-
# @see Sorting
|
18
|
-
# Sorting
|
17
|
+
# @see Sorting.asc
|
18
|
+
# Sorting.asc is the common way to create a Sorting::Ascending instance,
|
19
|
+
# or if you required 'sorting/convenience', then plain asc via Kernel#asc
|
19
20
|
#
|
20
21
|
# @see Sorting::Descending
|
21
22
|
# Sorting::Descending is the opposite of Sorting::Ascending
|
22
23
|
#
|
24
|
+
# @note
|
25
|
+
# require 'sorting' loads this class
|
26
|
+
#
|
23
27
|
class Ascending
|
24
28
|
|
25
29
|
# Valid values for the treat_nils parameter of Sorting::Ascending#initialize
|
data/lib/sorting/bigger.rb
CHANGED
@@ -12,6 +12,9 @@ module Sorting
|
|
12
12
|
#
|
13
13
|
# @see Sorting::Smaller
|
14
14
|
#
|
15
|
+
# @note
|
16
|
+
# require 'sorting' loads this module
|
17
|
+
#
|
15
18
|
module Bigger
|
16
19
|
extend Comparable
|
17
20
|
|
@@ -50,6 +53,8 @@ module Sorting
|
|
50
53
|
# (SR) Figure out why this ended up here. I (SR) think it was due to
|
51
54
|
# some comparison failing without it, but I don't remember which.
|
52
55
|
# The specific case should be documented.
|
56
|
+
# It is not due to "somestring" <=> Sorting::Bigger, that inverts
|
57
|
+
# the expression to Sorting::Bigger <=> "somestring"
|
53
58
|
#
|
54
59
|
def self.to_str
|
55
60
|
self
|
data/lib/sorting/convenience.rb
CHANGED
@@ -11,8 +11,29 @@ require 'sorting'
|
|
11
11
|
|
12
12
|
|
13
13
|
|
14
|
-
#
|
14
|
+
# The 'sorting/convenience' file patches the Kernel module and adds global
|
15
|
+
# `asc()` and `desc()` methods, which work like {Sorting::Helpers.asc} and
|
16
|
+
# {Sorting::Helpers.desc}
|
17
|
+
#
|
18
|
+
# @note
|
19
|
+
# you have to require 'sorting/convenience' to load this
|
20
|
+
#
|
15
21
|
module Kernel
|
16
|
-
|
17
|
-
|
22
|
+
Sorting::Helpers.append_to(self) # can't use include, see Sorting::Helpers.append_to
|
23
|
+
|
24
|
+
# @!method asc(*args, &lazy)
|
25
|
+
# @!scope class
|
26
|
+
# @see Sorting::Helpers.asc
|
27
|
+
#
|
28
|
+
# @note
|
29
|
+
# This method is a module function, and as such also available as a
|
30
|
+
# private instance method.
|
31
|
+
|
32
|
+
# @!method desc(*args, &lazy)
|
33
|
+
# @!scope class
|
34
|
+
# @see Sorting::Helpers.desc
|
35
|
+
#
|
36
|
+
# @note
|
37
|
+
# This method is a module function, and as such also available as a
|
38
|
+
# private instance method.
|
18
39
|
end
|
data/lib/sorting/descending.rb
CHANGED
@@ -18,11 +18,15 @@ module Sorting
|
|
18
18
|
# Sorting::Helpers is a module which provides you with a convenient .desc
|
19
19
|
# forwarding method
|
20
20
|
#
|
21
|
-
# @see Sorting
|
22
|
-
# Sorting
|
21
|
+
# @see Sorting.desc
|
22
|
+
# Sorting.desc is the common way to create a Sorting::Descending instance,
|
23
|
+
# or if you required 'sorting/convenience', then plain asc via Kernel#desc
|
23
24
|
#
|
24
|
-
# @see Sorting::
|
25
|
-
# Sorting::
|
25
|
+
# @see Sorting::Ascending
|
26
|
+
# Sorting::Ascending is the opposite of Sorting::Descending
|
27
|
+
#
|
28
|
+
# @note
|
29
|
+
# require 'sorting' loads this class
|
26
30
|
#
|
27
31
|
class Descending < Ascending
|
28
32
|
|
data/lib/sorting/helpers.rb
CHANGED
@@ -11,13 +11,17 @@ module Sorting
|
|
11
11
|
|
12
12
|
# This module provides convenience methods to create Sorting::Ascending and
|
13
13
|
# Sorting::Descending instances.
|
14
|
+
#
|
15
|
+
# Important: see {Sorting::Helpers.append_to} for how to properly use this
|
16
|
+
# module with other modules
|
17
|
+
#
|
18
|
+
# @note
|
19
|
+
# require 'sorting' loads this module
|
20
|
+
#
|
14
21
|
module Helpers
|
15
22
|
|
16
23
|
# The proc with the method definitions of asc and desc.
|
17
|
-
#
|
18
|
-
# to avoid an issue with methods of modules which are included in another
|
19
|
-
# module not being properly shared
|
20
|
-
#
|
24
|
+
# See {Sorting::Helpers.append_to} for an explanation.
|
21
25
|
MethodDefinitions = proc {
|
22
26
|
|
23
27
|
# Convenience method to create a Sorting::Ascending instance.
|
@@ -25,16 +29,53 @@ module Sorting
|
|
25
29
|
def asc(*args, &lazy)
|
26
30
|
Sorting::Ascending.new(*args, &lazy)
|
27
31
|
end
|
28
|
-
|
32
|
+
module_function :asc
|
29
33
|
|
30
34
|
# Convenience method to create a Sorting::Descending instance.
|
31
|
-
# Works exactly the same as {Sorting::
|
35
|
+
# Works exactly the same as {Sorting::Descending#initialize Ascending#initialize}
|
32
36
|
def desc(*args, &lazy)
|
33
37
|
Sorting::Descending.new(*args, &lazy)
|
34
38
|
end
|
35
|
-
|
39
|
+
module_function :desc
|
36
40
|
}
|
37
41
|
|
38
|
-
|
42
|
+
# Adds the Sorting::Helpers methods 'asc' and 'desc' to the given module.
|
43
|
+
# This method class_eval because modules included into modules don't
|
44
|
+
# properly share methods
|
45
|
+
#
|
46
|
+
# @param [Module] mod
|
47
|
+
# The class or module on which to append the Sorting::Helpers methods
|
48
|
+
#
|
49
|
+
# @note
|
50
|
+
# The methods are stored in the {Sorting::Helpers::MethodDefinitions}
|
51
|
+
# proc. That proc is class_eval'ed in in the module given by the `mod`
|
52
|
+
# parameter.
|
53
|
+
# It is done that way to avoid an issue with methods of modules which are
|
54
|
+
# included in another module not being properly shared
|
55
|
+
#
|
56
|
+
def self.append_to(mod)
|
57
|
+
mod.class_eval(&MethodDefinitions)
|
58
|
+
end
|
59
|
+
|
60
|
+
append_to(self)
|
61
|
+
|
62
|
+
# @!method asc(*args, &lazy)
|
63
|
+
# @!scope class
|
64
|
+
# Convenience method to create a Sorting::Ascending instance.
|
65
|
+
# Works exactly the same as {Sorting::Ascending#initialize}.
|
66
|
+
#
|
67
|
+
# @note
|
68
|
+
# This method is a module function, and as such also available as a
|
69
|
+
# private instance method.
|
70
|
+
|
71
|
+
# @!method desc(*args, &lazy)
|
72
|
+
# @!scope class
|
73
|
+
# Convenience method to create a Sorting::Descending instance.
|
74
|
+
# Works exactly the same as {Sorting::Ascending#initialize
|
75
|
+
# Descending#initialize}.
|
76
|
+
#
|
77
|
+
# @note
|
78
|
+
# This method is a module function, and as such also available as a
|
79
|
+
# private instance method.
|
39
80
|
end
|
40
81
|
end
|
data/lib/sorting/smaller.rb
CHANGED
@@ -12,6 +12,9 @@ module Sorting
|
|
12
12
|
#
|
13
13
|
# @see Sorting::Bigger
|
14
14
|
#
|
15
|
+
# @note
|
16
|
+
# require 'sorting' loads this module
|
17
|
+
#
|
15
18
|
module Smaller
|
16
19
|
extend Comparable
|
17
20
|
|
@@ -43,6 +46,8 @@ module Sorting
|
|
43
46
|
# (SR) Figure out why this ended up here. I (SR) think it was due to
|
44
47
|
# some comparison failing without it, but I don't remember which.
|
45
48
|
# The specific case should be documented.
|
49
|
+
# It is not due to "somestring" <=> Sorting::Smaller, that inverts
|
50
|
+
# the expression to Sorting::Smaller <=> "somestring"
|
46
51
|
#
|
47
52
|
def self.to_str
|
48
53
|
self
|
data/lib/sorting/version.rb
CHANGED
data/sorting.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "sorting"
|
5
|
-
s.version = "0.0.
|
5
|
+
s.version = "0.0.2"
|
6
6
|
s.authors = "Stefan Rusterholz"
|
7
7
|
s.email = "stefan.rusterholz@gmail.com"
|
8
8
|
s.homepage = "https://github.com/apeiros/sorting"
|
@@ -16,6 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
|
17
17
|
s.files =
|
18
18
|
Dir['bin/**/*'] +
|
19
|
+
Dir['documentation/**/*'] +
|
19
20
|
Dir['lib/**/*'] +
|
20
21
|
Dir['rake/**/*'] +
|
21
22
|
Dir['test/**/*'] +
|
@@ -26,10 +27,9 @@ Gem::Specification.new do |s|
|
|
26
27
|
Rakefile
|
27
28
|
README.markdown
|
28
29
|
]
|
29
|
-
|
30
|
+
|
30
31
|
if File.directory?('bin') then
|
31
|
-
executables = Dir.chdir('bin') { Dir.glob('**/*').select { |f| File.executable?(f) } }
|
32
|
-
s.executables = executables unless executables.empty?
|
32
|
+
s.executables = Dir.chdir('bin') { Dir.glob('**/*').select { |f| File.executable?(f) } }
|
33
33
|
end
|
34
34
|
|
35
35
|
s.required_ruby_version = ">= 1.9.2"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sorting
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-02-
|
12
|
+
date: 2013-02-23 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Helpful functionality for sorting and comparing.
|
15
15
|
email: stefan.rusterholz@gmail.com
|
@@ -17,6 +17,7 @@ executables: []
|
|
17
17
|
extensions: []
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
|
+
- documentation/examples.rb
|
20
21
|
- lib/sorting/ascending.rb
|
21
22
|
- lib/sorting/bigger.rb
|
22
23
|
- lib/sorting/convenience.rb
|