facets 2.1.3 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/AUTHORS +14 -12
- data/CHANGES +45 -2
- data/NOTES +9 -7
- data/lib/core/facets/1stclassmethod.rb +15 -11
- data/lib/core/facets/array.rb +0 -1
- data/lib/core/facets/array/conjoin.rb +40 -8
- data/lib/core/facets/array/delete.rb +8 -2
- data/lib/core/facets/array/indexable.rb +30 -3
- data/lib/core/facets/array/merge.rb +11 -0
- data/lib/core/facets/array/only.rb +3 -3
- data/lib/core/facets/array/pad.rb +4 -46
- data/lib/core/facets/array/rotate.rb +4 -4
- data/lib/core/facets/array/select.rb +2 -0
- data/lib/core/facets/array/splice.rb +16 -2
- data/lib/core/facets/array/stackable.rb +6 -40
- data/lib/core/facets/binding.rb +3 -0
- data/lib/core/facets/binding/cflow.rb +10 -64
- data/lib/core/facets/binding/defined.rb +10 -0
- data/lib/core/facets/binding/eval.rb +10 -76
- data/lib/core/facets/binding/here.rb +9 -0
- data/lib/core/facets/binding/self.rb +10 -0
- data/lib/core/facets/binding/vars.rb +0 -45
- data/lib/core/facets/boolean.rb +31 -103
- data/lib/core/facets/class/descendents.rb +17 -44
- data/lib/core/facets/comparable/bound.rb +8 -70
- data/lib/core/facets/comparable/cmp.rb +12 -92
- data/lib/core/facets/conversion.rb +122 -321
- data/lib/core/facets/dir/multiglob.rb +0 -13
- data/lib/core/facets/dir/traverse.rb +61 -111
- data/lib/core/facets/enumerable.rb +4 -2
- data/lib/core/facets/enumerable/cartesian.rb +36 -85
- data/lib/core/facets/enumerable/collect.rb +64 -152
- data/lib/core/facets/enumerable/combination.rb +40 -42
- data/lib/core/facets/enumerable/count.rb +99 -174
- data/lib/core/facets/enumerable/each.rb +86 -0
- data/lib/core/facets/enumerable/mash.rb +58 -0
- data/lib/core/facets/enumerable/permutation.rb +39 -44
- data/lib/core/facets/enumerable/probability.rb +16 -90
- data/lib/core/facets/enumerable/split.rb +113 -0
- data/lib/core/facets/exception/detail.rb +1 -2
- data/lib/core/facets/facets.rb +3 -2
- data/lib/core/facets/file/read.rb +4 -59
- data/lib/core/facets/file/topath.rb +8 -96
- data/lib/core/facets/file/write.rb +21 -49
- data/lib/core/facets/filetest/root.rb +4 -3
- data/lib/core/facets/functor.rb +5 -43
- data/lib/core/facets/hash/at.rb +7 -37
- data/lib/core/facets/hash/delete.rb +9 -58
- data/lib/core/facets/hash/has_keys.rb +4 -43
- data/lib/core/facets/hash/insert.rb +5 -38
- data/lib/core/facets/hash/inverse.rb +2 -41
- data/lib/core/facets/hash/iterate.rb +4 -45
- data/lib/core/facets/hash/keyize.rb +24 -92
- data/lib/core/facets/hash/merge.rb +4 -38
- data/lib/core/facets/hash/new.rb +5 -38
- data/lib/core/facets/hash/op.rb +20 -66
- data/lib/core/facets/hash/rekey.rb +9 -87
- data/lib/core/facets/hash/select.rb +1 -1
- data/lib/core/facets/hash/slice.rb +42 -0
- data/lib/core/facets/hash/traverse.rb +6 -46
- data/lib/core/facets/hash/update.rb +27 -67
- data/lib/core/facets/hash/weave.rb +22 -42
- data/lib/core/facets/indexable.rb +42 -14
- data/lib/core/facets/integer/bitmask.rb +69 -106
- data/lib/core/facets/integer/factorial.rb +1 -44
- data/lib/core/facets/integer/multiples.rb +27 -22
- data/lib/core/facets/integer/of.rb +1 -33
- data/lib/core/facets/kernel.rb +4 -2
- data/lib/core/facets/kernel/ask.rb +15 -3
- data/lib/core/facets/kernel/callstack.rb +38 -69
- data/lib/core/facets/kernel/constant.rb +2 -38
- data/lib/core/facets/kernel/deepcopy.rb +3 -55
- data/lib/core/facets/kernel/dir.rb +2 -0
- data/lib/core/facets/kernel/ergo.rb +2 -2
- data/lib/core/facets/kernel/instance.rb +51 -120
- data/lib/core/facets/kernel/metaid.rb +35 -73
- data/lib/core/facets/kernel/object.rb +14 -39
- data/lib/core/facets/kernel/op_esc.rb +24 -2
- data/lib/core/facets/kernel/populate.rb +6 -69
- data/lib/core/facets/kernel/report.rb +28 -33
- data/lib/core/facets/kernel/require.rb +7 -21
- data/lib/core/facets/kernel/respond.rb +11 -1
- data/lib/core/facets/kernel/returning.rb +50 -0
- data/lib/core/facets/kernel/silence.rb +12 -24
- data/lib/core/facets/kernel/super.rb +12 -76
- data/lib/core/facets/kernel/tap.rb +25 -107
- data/lib/core/facets/kernel/val.rb +7 -46
- data/lib/core/facets/kernel/withattr.rb +6 -64
- data/lib/core/facets/matchdata/matchset.rb +8 -50
- data/lib/core/facets/module.rb +3 -1
- data/lib/core/facets/module/abstract.rb +9 -47
- data/lib/core/facets/module/alias.rb +11 -68
- data/lib/core/facets/module/attr.rb +36 -15
- data/lib/core/facets/module/cattr.rb +8 -76
- data/lib/core/facets/module/clone.rb +15 -66
- data/lib/core/facets/module/include.rb +54 -114
- data/lib/core/facets/module/methods.rb +15 -13
- data/lib/core/facets/module/modify.rb +20 -206
- data/lib/core/facets/module/name.rb +19 -83
- data/lib/core/facets/module/require.rb +48 -53
- data/lib/core/facets/module/traits.rb +74 -33
- data/lib/core/facets/nilclass/status.rb +25 -2
- data/lib/core/facets/numeric/round.rb +24 -89
- data/lib/core/facets/proc/bind.rb +16 -59
- data/lib/core/facets/proc/compose.rb +6 -40
- data/lib/core/facets/proc/fn.rb +2 -0
- data/lib/core/facets/range/combine.rb +15 -51
- data/lib/core/facets/range/overlap.rb +8 -64
- data/lib/core/facets/regexp/arity.rb +6 -41
- data/lib/core/facets/stackable.rb +43 -4
- data/lib/core/facets/string.rb +2 -0
- data/lib/core/facets/string/align.rb +45 -55
- data/lib/core/facets/string/blank.rb +2 -46
- data/lib/core/facets/string/bracket.rb +14 -87
- data/lib/core/facets/string/case.rb +45 -32
- data/lib/core/facets/string/crypt.rb +3 -40
- data/lib/core/facets/string/filter.rb +7 -49
- data/lib/core/facets/string/format.rb +24 -126
- data/lib/core/facets/string/indexable.rb +50 -133
- data/lib/core/facets/string/interpolate.rb +24 -59
- data/lib/core/facets/string/natcmp.rb +5 -39
- data/lib/core/facets/string/nchar.rb +37 -45
- data/lib/core/facets/string/op.rb +13 -0
- data/lib/core/facets/string/partitions.rb +38 -99
- data/lib/core/facets/string/range.rb +8 -49
- data/lib/core/facets/string/regesc.rb +9 -42
- data/lib/core/facets/string/scan.rb +6 -52
- data/lib/core/facets/string/splice.rb +8 -13
- data/lib/core/facets/string/tabs.rb +16 -153
- data/lib/core/facets/symbol.rb +3 -1
- data/lib/core/facets/symbol/chomp.rb +11 -29
- data/lib/core/facets/symbol/generate.rb +4 -43
- data/lib/core/facets/symbol/not.rb +13 -25
- data/lib/core/facets/symbol/shadow.rb +2 -40
- data/lib/core/facets/symbol/succ.rb +14 -13
- data/lib/core/facets/symbol/to_proc.rb +33 -28
- data/lib/core/facets/time.rb +1 -0
- data/lib/core/facets/time/change.rb +5 -38
- data/lib/core/facets/time/elapse.rb +2 -41
- data/lib/core/facets/time/stamp.rb +47 -0
- data/lib/core/facets/unboundmethod.rb +3 -0
- data/lib/core/facets/unboundmethod/arguments.rb +27 -4
- data/lib/core/facets/unboundmethod/name.rb +21 -7
- data/lib/methods/facets/enumerable/cluster_by.rb +1 -1
- data/lib/methods/facets/enumerable/collate.rb +1 -0
- data/lib/methods/facets/enumerable/divide.rb +1 -1
- data/lib/methods/facets/enumerable/each_by.rb +1 -1
- data/lib/methods/facets/enumerable/each_pair.rb +1 -1
- data/lib/methods/facets/enumerable/eachn.rb +1 -1
- data/lib/methods/facets/enumerable/graph.rb +1 -1
- data/lib/methods/facets/enumerable/group_by.rb +1 -1
- data/lib/methods/facets/enumerable/inject.rb +1 -0
- data/lib/methods/facets/enumerable/map_send.rb +1 -0
- data/lib/methods/facets/enumerable/modulate.rb +1 -0
- data/lib/methods/facets/enumerable/partition_by.rb +1 -1
- data/lib/methods/facets/hash/collate.rb +1 -1
- data/lib/methods/facets/hash/except.rb +1 -0
- data/lib/methods/facets/hash/graph.rb +1 -1
- data/lib/methods/facets/hash/mash.rb +1 -0
- data/lib/methods/facets/kernel/Bit.rb +1 -0
- data/lib/methods/facets/kernel/complete.rb +1 -1
- data/lib/methods/facets/kernel/here.rb +1 -1
- data/lib/methods/facets/kernel/non_nil.rb +1 -0
- data/lib/methods/facets/kernel/respond_with_value.rb +1 -0
- data/lib/methods/facets/kernel/with.rb +1 -1
- data/lib/methods/facets/module/class_def.rb +1 -0
- data/lib/methods/facets/string/camelcase.rb +1 -0
- data/lib/methods/facets/string/op_minus.rb +1 -0
- data/lib/methods/facets/string/snakecase.rb +1 -0
- data/lib/more/facets/attributes.rb +5 -5
- data/lib/more/facets/basicobject.rb +0 -62
- data/lib/{core/facets/continuation/create.rb → more/facets/continuation.rb} +4 -21
- data/lib/more/facets/duration.rb +534 -0
- data/lib/more/facets/lazy.rb +3 -3
- data/lib/more/facets/namespace.rb +23 -71
- data/lib/more/facets/rbsystem.rb +42 -8
- data/lib/more/facets/stylize.rb +6 -3
- data/lib/more/facets/thread.rb +55 -0
- data/meta/MANIFEST +49 -18
- data/meta/ROLLRC +1 -1
- data/meta/project.yaml +2 -2
- data/task/install +1 -1
- data/task/test/general +8 -2
- data/test/unit/array/test_pad.rb +30 -45
- data/test/unit/array/test_stackable.rb +14 -28
- data/test/unit/binding/test_cflow.rb +34 -49
- data/test/unit/binding/test_defined.rb +17 -0
- data/test/unit/binding/test_eval.rb +11 -39
- data/test/unit/binding/test_here.rb +17 -0
- data/test/unit/binding/test_self.rb +17 -0
- data/test/unit/binding/test_vars.rb +22 -37
- data/test/unit/class/test_descendents.rb +15 -30
- data/test/unit/class/test_initializer.rb +1 -8
- data/test/unit/comparable/test_bound.rb +38 -53
- data/test/unit/comparable/test_cmp.rb +45 -60
- data/test/unit/dir/test_traverse.rb +56 -0
- data/test/unit/enumerable/test_cartesian.rb +34 -47
- data/test/unit/enumerable/test_collect.rb +16 -125
- data/test/unit/enumerable/test_combination.rb +1 -8
- data/test/unit/enumerable/test_count.rb +51 -66
- data/test/unit/enumerable/test_each.rb +77 -0
- data/test/unit/enumerable/test_mash.rb +51 -0
- data/test/unit/enumerable/test_permutation.rb +1 -7
- data/test/unit/enumerable/test_probability.rb +42 -55
- data/test/unit/enumerable/test_split.rb +52 -0
- data/test/unit/exception/test_detail.rb +19 -0
- data/test/unit/file/test_read.rb +34 -0
- data/test/unit/file/test_topath.rb +17 -25
- data/test/unit/file/test_write.rb +6 -12
- data/test/unit/filetest/test_root.rb +14 -0
- data/test/unit/hash/test_at.rb +9 -21
- data/test/unit/hash/test_delete.rb +22 -37
- data/test/unit/hash/test_has_keys.rb +13 -28
- data/test/unit/hash/test_insert.rb +9 -23
- data/test/unit/hash/test_inverse.rb +11 -26
- data/test/unit/hash/test_iterate.rb +16 -31
- data/test/unit/hash/test_keyize.rb +40 -55
- data/test/unit/hash/test_merge.rb +10 -25
- data/test/unit/hash/test_new.rb +9 -24
- data/test/unit/hash/test_op.rb +1 -7
- data/test/unit/hash/test_rekey.rb +47 -62
- data/test/unit/hash/test_traverse.rb +17 -32
- data/test/unit/hash/test_update.rb +30 -45
- data/test/unit/hash/test_weave.rb +10 -23
- data/test/unit/integer/test_bitmask.rb +48 -44
- data/test/unit/integer/test_factorial.rb +11 -26
- data/test/unit/integer/test_multiples.rb +1 -5
- data/test/unit/integer/test_of.rb +14 -29
- data/test/unit/kernel/test_callstack.rb +13 -28
- data/test/unit/kernel/test_constant.rb +14 -28
- data/test/unit/kernel/test_deepcopy.rb +20 -35
- data/test/unit/kernel/test_instance.rb +46 -61
- data/test/unit/kernel/test_metaid.rb +42 -57
- data/test/unit/kernel/test_object.rb +14 -29
- data/test/unit/kernel/test_populate.rb +38 -53
- data/test/unit/kernel/test_report.rb +1 -7
- data/test/unit/kernel/test_returning.rb +16 -0
- data/test/unit/kernel/test_silence.rb +8 -23
- data/test/unit/kernel/test_super.rb +41 -56
- data/test/unit/kernel/test_tap.rb +15 -39
- data/test/unit/kernel/test_val.rb +7 -20
- data/test/unit/kernel/test_withattr.rb +29 -44
- data/test/unit/matchdata/test_matchset.rb +20 -35
- data/test/unit/module/test_abstract.rb +15 -30
- data/test/unit/module/test_alias.rb +32 -45
- data/test/unit/module/test_cattr.rb +39 -54
- data/test/unit/module/test_clone.rb +31 -43
- data/test/unit/module/test_include.rb +1 -35
- data/test/unit/module/test_modify.rb +102 -114
- data/test/unit/module/test_name.rb +1 -7
- data/test/unit/numeric/test_round.rb +46 -61
- data/test/unit/proc/test_bind.rb +29 -44
- data/test/unit/proc/test_compose.rb +20 -35
- data/test/unit/range/test_combine.rb +14 -29
- data/test/unit/range/test_overlap.rb +34 -51
- data/test/unit/regexp/test_arity.rb +14 -29
- data/test/unit/string/test_align.rb +13 -27
- data/test/unit/string/test_blank.rb +12 -27
- data/test/unit/string/test_bracket.rb +52 -67
- data/test/unit/string/test_case.rb +19 -38
- data/test/unit/string/test_crypt.rb +10 -25
- data/test/unit/string/test_filter.rb +1 -7
- data/test/unit/string/test_format.rb +2 -7
- data/test/unit/string/test_indexable.rb +54 -69
- data/test/unit/string/test_interpolate.rb +8 -21
- data/test/unit/string/test_natcmp.rb +11 -26
- data/test/unit/string/test_nchar.rb +1 -14
- data/test/unit/string/test_op.rb +14 -0
- data/test/unit/string/test_partitions.rb +39 -54
- data/test/unit/string/test_range.rb +17 -32
- data/test/unit/string/test_regesc.rb +1 -7
- data/test/unit/string/test_scan.rb +23 -38
- data/test/unit/string/test_stackable.rb +79 -98
- data/test/unit/string/test_tabs.rb +1 -7
- data/test/unit/symbol/test_chomp.rb +10 -21
- data/test/unit/symbol/test_generate.rb +7 -22
- data/test/unit/symbol/test_not.rb +10 -25
- data/test/unit/symbol/test_shadow.rb +8 -23
- data/test/unit/symbol/test_succ.rb +1 -7
- data/test/unit/symbol/test_to_proc.rb +1 -7
- data/test/unit/test_attributes.rb +1 -1
- data/test/unit/test_continuation.rb +13 -0
- data/test/unit/test_conversion.rb +1 -14
- data/test/unit/test_namespace.rb +30 -3
- data/test/unit/test_thread.rb +23 -0
- data/test/unit/time/test_change.rb +11 -26
- data/test/unit/time/test_elapse.rb +10 -25
- data/test/unit/time/test_stamp.rb +28 -0
- metadata +65 -25
- data/lib/core/facets/array/unzip.rb +0 -14
- data/lib/core/facets/continuation.rb +0 -1
- data/lib/core/facets/enumerable/collate.rb +0 -104
- data/lib/core/facets/kernel/require_esc.rb +0 -44
- data/lib/more/facets/mapsend.rb +0 -98
- data/lib/more/facets/pp_s.rb +0 -30
- data/log/history.rd +0 -38
- data/log/todo.rd +0 -4
- data/task/special/quickopts +0 -15
- data/test/unit/continuation/test_create.rb +0 -28
- data/test/unit/enumerable/test_collate.rb +0 -51
- data/test/unit/kernel/test_require_esc.rb +0 -29
- data/test/unit/test_mapsend.rb +0 -18
- data/test/unit/test_pp_s.rb +0 -17
@@ -1,7 +1,3 @@
|
|
1
|
-
# LOG:
|
2
|
-
# - 2007.11.01 Trans
|
3
|
-
# Deprecated #each_uniq_pair, just use #each_combination instead.
|
4
|
-
|
5
1
|
require 'facets/integer/factorial'
|
6
2
|
|
7
3
|
module Enumerable
|
@@ -27,7 +23,7 @@ module Enumerable
|
|
27
23
|
# ["b", "x", "x"]
|
28
24
|
# ["b", "x", "y"]
|
29
25
|
#
|
30
|
-
# CREDIT Florian Gross
|
26
|
+
# CREDIT: Florian Gross
|
31
27
|
|
32
28
|
def self.combinations(head, *rest)
|
33
29
|
crest = rest.empty? ? [[]] : combinations(*rest)
|
@@ -50,7 +46,7 @@ module Enumerable
|
|
50
46
|
# ["a", "c", "d"]
|
51
47
|
# ["b", "c", "d"]
|
52
48
|
#
|
53
|
-
# CREDIT Florian Gross
|
49
|
+
# CREDIT: Florian Gross
|
54
50
|
|
55
51
|
def each_combination(k=2)
|
56
52
|
s = to_a
|
@@ -67,42 +63,44 @@ module Enumerable
|
|
67
63
|
end
|
68
64
|
end
|
69
65
|
|
70
|
-
#
|
71
|
-
#
|
72
|
-
# #
|
73
|
-
# #
|
74
|
-
# #
|
75
|
-
# #
|
76
|
-
# #
|
77
|
-
# #
|
78
|
-
# #
|
79
|
-
# #
|
80
|
-
# # 1,
|
81
|
-
# #
|
82
|
-
# #
|
83
|
-
# # 3
|
84
|
-
# #
|
85
|
-
# #
|
86
|
-
# #
|
87
|
-
# #
|
88
|
-
# #
|
89
|
-
# #
|
90
|
-
# #
|
91
|
-
# #
|
92
|
-
# #
|
93
|
-
# #
|
94
|
-
# #
|
95
|
-
# # 2
|
96
|
-
# #
|
97
|
-
# #
|
98
|
-
#
|
99
|
-
#
|
100
|
-
#
|
101
|
-
#
|
102
|
-
#
|
103
|
-
# #
|
104
|
-
# #
|
105
|
-
#
|
66
|
+
# NOTE: Deprecated #each_uniq_pair, just use #each_combination instead.
|
67
|
+
#
|
68
|
+
# # Processes each unique pair (of indices, not value)
|
69
|
+
# # in the array by yielding them to the supplied block.
|
70
|
+
# #
|
71
|
+
# # a = [1,2,3,4]
|
72
|
+
# # a.each_unique_pair{ |a,b| puts a+','+b }
|
73
|
+
# #
|
74
|
+
# # produces
|
75
|
+
# #
|
76
|
+
# # 1,2
|
77
|
+
# # 1,3
|
78
|
+
# # 1,4
|
79
|
+
# # 2,3
|
80
|
+
# # 2,4
|
81
|
+
# # 3,4
|
82
|
+
# #
|
83
|
+
# # This does not guarantee the uniqueness of values.
|
84
|
+
# # For example:
|
85
|
+
# #
|
86
|
+
# # a = [1,2,1]
|
87
|
+
# # a.each_unique_pair{ |a,b| puts a+','+b }
|
88
|
+
# #
|
89
|
+
# # prduces
|
90
|
+
# #
|
91
|
+
# # 1,2
|
92
|
+
# # 1,1
|
93
|
+
# # 2,1
|
94
|
+
# #
|
95
|
+
# # This is equivalent to <tt>each_combination(2){ ... }</tt>.
|
96
|
+
#
|
97
|
+
# def each_unique_pair(&yld)
|
98
|
+
# self.each_combination(2,&yld)
|
99
|
+
# #s = self.to_a
|
100
|
+
# #self.each_with_index{ |a,i|
|
101
|
+
# # self[(i+1)..-1].each{ |b| yield a,b }
|
102
|
+
# #}
|
103
|
+
# end
|
106
104
|
|
107
105
|
end
|
108
106
|
|
@@ -1,35 +1,80 @@
|
|
1
|
-
# TITLE:
|
2
|
-
#
|
3
|
-
# Enumerable Counting
|
4
|
-
#
|
5
|
-
# SUMMARY:
|
6
|
-
#
|
7
|
-
# Extensions related to counting and uniquness.
|
8
|
-
#
|
9
|
-
# AUTHORS:
|
10
|
-
#
|
11
|
-
# - Florian Gross
|
12
|
-
# - Thomas Sawyer
|
13
|
-
# - Gavin Sinclair
|
14
|
-
# - Gavin Kistner
|
15
|
-
|
16
|
-
#
|
17
1
|
module Enumerable
|
18
2
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
3
|
+
unless (RUBY_VERSION[0,3] == '1.9')
|
4
|
+
|
5
|
+
# Count the number of items in an enumerable
|
6
|
+
# equal (==) to the given object.
|
7
|
+
#
|
8
|
+
# e = [ 'a', '1', 'a' ]
|
9
|
+
# e.count('1') #=> 1
|
10
|
+
# e.count('a') #=> 2
|
11
|
+
#
|
12
|
+
# Count can also handle multiple-valued blocks.
|
13
|
+
#
|
14
|
+
# e = { 'a' => 2, 'a' => 2, 'b' => 1 }
|
15
|
+
# e.count('a',2) #=> 1
|
16
|
+
#
|
17
|
+
# CREDIT: Trans
|
18
|
+
|
19
|
+
def count(*c)
|
20
|
+
self.select{ |*i| i == c }.length
|
21
|
+
end
|
22
|
+
|
23
|
+
# Enumerable#one? returns +true+ if and only if <em>exactly one</em>
|
24
|
+
# element in the collection satisfies the given predicate.
|
25
|
+
#
|
26
|
+
# If no predicate is provided, Enumerable#one? returns +true+ if
|
27
|
+
# and only if <em>exactly one</em> element has a true value
|
28
|
+
# (i.e. not +nil+ or +false+).
|
29
|
+
#
|
30
|
+
# [].one? # false
|
31
|
+
# [nil].one? # false
|
32
|
+
# [5].one? # true
|
33
|
+
# [5,8,9].one? # false
|
34
|
+
# (1...10).one? { |n| n == 5 } # true
|
35
|
+
# (1...10).one? { |n| n < 5 } # false
|
36
|
+
#
|
37
|
+
# CREDIT: Gavin Sinclair
|
38
|
+
|
39
|
+
def one? # :yield: e
|
40
|
+
matches = 0
|
41
|
+
if block_given?
|
42
|
+
self.each do |e|
|
43
|
+
if yield(e)
|
44
|
+
matches += 1
|
45
|
+
return false if matches > 1
|
46
|
+
end
|
47
|
+
end
|
48
|
+
return (matches == 1)
|
49
|
+
else
|
50
|
+
one? { |e| e }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Enumerable#none? is the logical opposite of the builtin method
|
55
|
+
# Enumerable#any?. It returns +true+ if and only if _none_ of
|
56
|
+
# the elements in the collection satisfy the predicate.
|
57
|
+
#
|
58
|
+
# If no predicate is provided, Enumerable#none? returns +true+
|
59
|
+
# if and only if _none_ of the elements have a true value
|
60
|
+
# (i.e. not +nil+ or +false+).
|
61
|
+
#
|
62
|
+
# [].none? # true
|
63
|
+
# [nil].none? # true
|
64
|
+
# [5,8,9].none? # false
|
65
|
+
# (1...10).none? { |n| n < 0 } # true
|
66
|
+
# (1...10).none? { |n| n > 0 } # false
|
67
|
+
#
|
68
|
+
# CREDIT: Gavin Sinclair
|
69
|
+
|
70
|
+
def none? # :yield: e
|
71
|
+
if block_given?
|
72
|
+
not self.any? { |e| yield e }
|
73
|
+
else
|
74
|
+
not self.any?
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
33
78
|
end
|
34
79
|
|
35
80
|
# Returns an array of elements for the elements that occur n times.
|
@@ -45,6 +90,8 @@ module Enumerable
|
|
45
90
|
# [1,1,2,3,3,4,5,5].occur { |n| n == 1 } #=> [2,4]
|
46
91
|
# [1,1,2,3,3,4,5,5].occur { |n| n > 1 } #=> [1,3,5]
|
47
92
|
#
|
93
|
+
# CREDIT: ?
|
94
|
+
|
48
95
|
def occur(n=nil) #:yield:
|
49
96
|
result = Hash.new { |hash, key| hash[key] = Array.new }
|
50
97
|
self.each do |item|
|
@@ -64,12 +111,12 @@ module Enumerable
|
|
64
111
|
return result.values.flatten.uniq
|
65
112
|
end
|
66
113
|
|
67
|
-
# CREDIT Gavin Kistner
|
68
|
-
|
69
114
|
# Uses #+ to sum the enumerated elements.
|
70
115
|
#
|
71
116
|
# [1,2,3].sum #=> 6
|
72
117
|
# [3,3,3].sum #=> 9
|
118
|
+
#
|
119
|
+
# CREDIT: Gavin Kistner
|
73
120
|
|
74
121
|
def sum
|
75
122
|
v = 0
|
@@ -77,9 +124,12 @@ module Enumerable
|
|
77
124
|
v
|
78
125
|
end
|
79
126
|
|
80
|
-
#
|
81
|
-
|
127
|
+
# Returns a list on non-unique,
|
128
|
+
#
|
129
|
+
# [1,1,2,2,3,4,5].nonuniq #=> [1,2]
|
82
130
|
#
|
131
|
+
# CREDIT: Martin DeMello
|
132
|
+
|
83
133
|
def nonuniq
|
84
134
|
h1 = {}
|
85
135
|
h2 = {}
|
@@ -90,19 +140,21 @@ module Enumerable
|
|
90
140
|
h2.keys
|
91
141
|
end
|
92
142
|
|
93
|
-
# #
|
94
|
-
# def nonuniq!
|
95
|
-
# raise unless respond_to?(:replace)
|
96
|
-
# h1 = {}
|
97
|
-
# h2 = {}
|
98
|
-
# each {|i|
|
99
|
-
# h2[i] = true if h1[i]
|
100
|
-
# h1[i] = true
|
101
|
-
# }
|
102
|
-
# self.replace(h2.keys)
|
103
|
-
# end
|
143
|
+
# #
|
144
|
+
# def nonuniq!
|
145
|
+
# raise unless respond_to?(:replace)
|
146
|
+
# h1 = {}
|
147
|
+
# h2 = {}
|
148
|
+
# each {|i|
|
149
|
+
# h2[i] = true if h1[i]
|
150
|
+
# h1[i] = true
|
151
|
+
# }
|
152
|
+
# self.replace(h2.keys)
|
153
|
+
# end
|
104
154
|
|
105
155
|
# Return list of dulicate elements.
|
156
|
+
#
|
157
|
+
# CREDIT: Thibaut Barrère
|
106
158
|
|
107
159
|
alias_method :duplicates, :nonuniq
|
108
160
|
|
@@ -114,137 +166,10 @@ module Enumerable
|
|
114
166
|
#
|
115
167
|
# [-5, -4, -3, -2, -1, 0]
|
116
168
|
#
|
169
|
+
# CREDIT: ?
|
170
|
+
|
117
171
|
def uniq_by #:yield:
|
118
172
|
h = {}; inject([]) {|a,x| h[yield(x)] ||= a << x}
|
119
173
|
end
|
120
174
|
|
121
|
-
# Enumerable#one? returns +true+ if and only if <em>exactly one</em>
|
122
|
-
# element in the collection satisfies the given predicate.
|
123
|
-
#
|
124
|
-
# If no predicate is provided, Enumerable#one? returns +true+ if
|
125
|
-
# and only if <em>exactly one</em> element has a true value
|
126
|
-
# (i.e. not +nil+ or +false+).
|
127
|
-
#
|
128
|
-
# [].one? # false
|
129
|
-
# [nil].one? # false
|
130
|
-
# [5].one? # true
|
131
|
-
# [5,8,9].one? # false
|
132
|
-
# (1...10).one? { |n| n == 5 } # true
|
133
|
-
# (1...10).one? { |n| n < 5 } # false
|
134
|
-
#
|
135
|
-
#--
|
136
|
-
# Credit goes to Gavin Sinclair.
|
137
|
-
#++
|
138
|
-
def one? # :yield: e
|
139
|
-
matches = 0
|
140
|
-
if block_given?
|
141
|
-
self.each do |e|
|
142
|
-
if yield(e)
|
143
|
-
matches += 1
|
144
|
-
return false if matches > 1
|
145
|
-
end
|
146
|
-
end
|
147
|
-
return (matches == 1)
|
148
|
-
else
|
149
|
-
one? { |e| e }
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
# Enumerable#none? is the logical opposite of the builtin method
|
154
|
-
# Enumerable#any?. It returns +true+ if and only if _none_ of
|
155
|
-
# the elements in the collection satisfy the predicate.
|
156
|
-
#
|
157
|
-
# If no predicate is provided, Enumerable#none? returns +true+
|
158
|
-
# if and only if _none_ of the elements have a true value
|
159
|
-
# (i.e. not +nil+ or +false+).
|
160
|
-
#
|
161
|
-
# [].none? # true
|
162
|
-
# [nil].none? # true
|
163
|
-
# [5,8,9].none? # false
|
164
|
-
# (1...10).none? { |n| n < 0 } # true
|
165
|
-
# (1...10).none? { |n| n > 0 } # false
|
166
|
-
#
|
167
|
-
#--
|
168
|
-
# Credit goes to Gavin Sinclair.
|
169
|
-
#++
|
170
|
-
def none? # :yield: e
|
171
|
-
if block_given?
|
172
|
-
not self.any? { |e| yield e }
|
173
|
-
else
|
174
|
-
not self.any?
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
175
|
end
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
# _____ _
|
183
|
-
# |_ _|__ ___| |_
|
184
|
-
# | |/ _ \/ __| __|
|
185
|
-
# | | __/\__ \ |_
|
186
|
-
# |_|\___||___/\__|
|
187
|
-
#
|
188
|
-
=begin test
|
189
|
-
|
190
|
-
require 'test/unit'
|
191
|
-
|
192
|
-
class TestEnumerableCount < Test::Unit::TestCase
|
193
|
-
|
194
|
-
def test_occur
|
195
|
-
arr = [:a,:b,:a]
|
196
|
-
assert_equal( [:b], arr.occur(1) )
|
197
|
-
assert_equal( [:a], arr.occur(2) )
|
198
|
-
assert_equal( [:b], arr.occur(1..1) )
|
199
|
-
assert_equal( [:a], arr.occur{ |n| n % 2 == 0 } )
|
200
|
-
end
|
201
|
-
|
202
|
-
def test_count_01
|
203
|
-
e = [ 'a', '1', 'a' ]
|
204
|
-
assert_equal( 1, e.count('1') )
|
205
|
-
assert_equal( 2, e.count('a') )
|
206
|
-
end
|
207
|
-
|
208
|
-
def test_count_02
|
209
|
-
e = [ ['a',2], ['a',2], ['a',2], ['b',1] ]
|
210
|
-
assert_equal( 3, e.count(['a',2]) )
|
211
|
-
end
|
212
|
-
|
213
|
-
def test_count_03
|
214
|
-
e = { 'a' => 2, 'a' => 2, 'b' => 1 }
|
215
|
-
assert_equal( 1, e.count('a',2) )
|
216
|
-
end
|
217
|
-
|
218
|
-
def test_uniq_by
|
219
|
-
a = [-5, -4, -3, -2, -1, 0]
|
220
|
-
r = (-5..5).to_a.uniq_by{|i| i*i }
|
221
|
-
assert_equal( a, r )
|
222
|
-
end
|
223
|
-
|
224
|
-
def test_one?
|
225
|
-
a = [nil, true]
|
226
|
-
assert( a.one? )
|
227
|
-
a = [true, false]
|
228
|
-
assert( a.one? )
|
229
|
-
a = [true, true]
|
230
|
-
assert( ! a.one? )
|
231
|
-
a = [true, 1]
|
232
|
-
assert( ! a.one? )
|
233
|
-
a = [1, 1]
|
234
|
-
assert( ! a.one? )
|
235
|
-
end
|
236
|
-
|
237
|
-
def test_none?
|
238
|
-
a = [nil, nil]
|
239
|
-
assert( a.none? )
|
240
|
-
a = [false, false]
|
241
|
-
assert( a.none? )
|
242
|
-
a = [true, false]
|
243
|
-
assert( ! a.none? )
|
244
|
-
a = [nil, 1]
|
245
|
-
assert( ! a.none? )
|
246
|
-
end
|
247
|
-
|
248
|
-
end
|
249
|
-
|
250
|
-
=end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# TODO:
|
2
|
+
#
|
3
|
+
# - Remove require 'enumerator' for Ruby 1.9.
|
4
|
+
# - Suggest Enumerator's #each_slice use block arity if no parameter is given.
|
5
|
+
|
6
|
+
require 'enumerator' # for each_slice
|
7
|
+
|
8
|
+
module Enumerable
|
9
|
+
|
10
|
+
# Iterate through slices. If slicing +step+ is not
|
11
|
+
# given, the the arity if the block is used.
|
12
|
+
#
|
13
|
+
# x = []
|
14
|
+
# [1,2,3,4].each_by{ |a,b| x << [a,b] }
|
15
|
+
# x #=> [ [1,2], [3,4] ]
|
16
|
+
#
|
17
|
+
# x = []
|
18
|
+
# [1,2,3,4,5,6].each_by(3){ |a| x << a }
|
19
|
+
# x #=> [ [1,2,3], [4,5,6] ]
|
20
|
+
#
|
21
|
+
# CREDIT: Trans
|
22
|
+
|
23
|
+
def each_by(step=nil, &yld)
|
24
|
+
if step
|
25
|
+
each_slice(step,&yld)
|
26
|
+
else
|
27
|
+
step = yld.arity.abs
|
28
|
+
each_slice(step,&yld)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Iterators over each element pairing.
|
33
|
+
#
|
34
|
+
# [:a,:b,:c,:d].each_pair { |a,b| puts "#{a} -> #{b}" }
|
35
|
+
#
|
36
|
+
# _produces_
|
37
|
+
#
|
38
|
+
# a -> b
|
39
|
+
# c -> d
|
40
|
+
#
|
41
|
+
# CREDIT: Martin DeMello
|
42
|
+
|
43
|
+
def each_pair #:yield:
|
44
|
+
e1 = nil
|
45
|
+
each_with_index do |e,i|
|
46
|
+
if i % 2 == 0
|
47
|
+
e1 = e
|
48
|
+
next
|
49
|
+
else
|
50
|
+
yield(e1,e)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Collect each n items based on arity.
|
56
|
+
#
|
57
|
+
# [1,2,3,4].eachn do |x, y|
|
58
|
+
# [x,y]
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
# _produces_
|
62
|
+
#
|
63
|
+
# [1,2]
|
64
|
+
# [3,4]
|
65
|
+
#
|
66
|
+
# CREDIT: Martin DeMello
|
67
|
+
|
68
|
+
def eachn(&block)
|
69
|
+
n = block.arity.abs
|
70
|
+
each_slice(n) {|i| block.call(*i)}
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
# DEPRECATED
|
75
|
+
#
|
76
|
+
# # Why the term counter? There may be a change in Ruby 2.0
|
77
|
+
# # to use this word instead of index. Index will
|
78
|
+
# # still be used for Array, since that is the proper meaning
|
79
|
+
# # in that context. In the mean time, aliases are provided.
|
80
|
+
#
|
81
|
+
# # More appropriate naming since an enumerable is not
|
82
|
+
# # neccesarily "indexed", as is an Array or Hash.
|
83
|
+
# alias_method :each_with_counter, :each_with_index
|
84
|
+
|
85
|
+
end
|
86
|
+
|