facets 3.0.0 → 3.1.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.
- checksums.yaml +4 -4
- data/.index +11 -7
- data/CONTRIBUTING.md +112 -0
- data/HISTORY.md +38 -0
- data/{README.rdoc → README.md} +59 -59
- data/demo/core/array/after.md +13 -0
- data/demo/core/array/arrange.md +17 -0
- data/demo/core/array/before.md +14 -0
- data/demo/core/array/collapse.md +15 -0
- data/demo/core/array/collisions.md +30 -0
- data/demo/core/array/commonality.md +31 -0
- data/demo/core/array/conjoin.md +47 -0
- data/demo/core/array/contains.md +9 -0
- data/demo/core/array/delete_unless.md +13 -0
- data/demo/core/array/delete_values.md +10 -0
- data/demo/core/array/delete_values_at.md +15 -0
- data/demo/core/array/divide.md +14 -0
- data/demo/core/array/duplicates.md +14 -0
- data/demo/core/array/each_overlap.md +12 -0
- data/demo/core/array/each_pair.md +13 -0
- data/demo/core/array/each_value.md +12 -0
- data/demo/core/array/entropy.md +13 -0
- data/demo/core/array/extract_options.md +13 -0
- data/demo/core/array/first.md +11 -0
- data/demo/core/array/from.md +11 -0
- data/demo/core/array/ideal_entropy.md +11 -0
- data/demo/core/array/intersection.md +11 -0
- data/demo/core/array/last.md +11 -0
- data/demo/core/array/median.md +23 -0
- data/demo/core/array/merge.md +15 -0
- data/demo/core/array/missing.md +10 -0
- data/demo/core/array/mode.md +9 -0
- data/demo/core/array/nonuniq.md +16 -0
- data/demo/core/array/not_empty.md +8 -0
- data/demo/core/array/occur.md +18 -0
- data/demo/core/array/occurrence.md +13 -0
- data/demo/core/array/only.md +9 -0
- data/demo/core/array/op_pow.md +10 -0
- data/demo/core/array/pad.md +28 -0
- data/demo/core/array/peek.md +10 -0
- data/demo/core/array/poke.md +15 -0
- data/demo/core/array/probability +8 -0
- data/demo/core/array/pull.md +10 -0
- data/demo/core/array/recurse.md +10 -0
- data/demo/core/array/recursively.md +20 -0
- data/demo/core/array/reject_values.md +10 -0
- data/demo/core/array/splice.md +14 -0
- data/demo/core/array/split.md +13 -0
- data/demo/core/array/squeeze.md +14 -0
- data/demo/core/array/step.md +16 -0
- data/demo/core/array/store.md +9 -0
- data/demo/core/array/thru.md +12 -0
- data/demo/core/array/to_h.md +11 -0
- data/demo/core/array/traverse.md +20 -0
- data/demo/core/array/uniq_by.md +16 -0
- data/demo/core/array/unique_permutation.md +14 -0
- data/demo/core/array/zip.md +8 -0
- data/demo/core/binding/caller.md +57 -0
- data/demo/core/binding/defined.md +10 -0
- data/demo/core/binding/opvars.md +16 -0
- data/demo/core/binding/self.md +6 -0
- data/demo/core/class/descendants.md +13 -0
- data/demo/core/class/to_proc.md +11 -0
- data/demo/core/comparable/at_least.md +11 -0
- data/demo/core/comparable/at_most.md +11 -0
- data/demo/core/comparable/bound.md +13 -0
- data/demo/core/comparable/cap.md +11 -0
- data/demo/core/comparable/clip.md +29 -0
- data/demo/core/comparable/cmp.md +18 -0
- data/demo/core/comparable/op_get.md +32 -0
- data/demo/core/dir/ascend.md +24 -0
- data/demo/core/dir/descend.md +16 -0
- data/demo/core/dir/multiglob.md +41 -0
- data/demo/core/dir/parent.md +6 -0
- data/demo/core/dir/recurse.md +41 -0
- data/demo/core/exception/detail.md +19 -0
- data/demo/core/{facets.rdoc → facets.md} +1 -1
- data/demo/core/filetest/root.md +13 -0
- data/demo/core/hash/recursively.md +21 -0
- data/demo/core/indexable.md +95 -0
- data/demo/core/integer/bitmask.md +46 -0
- data/demo/core/integer/{factorial.rdoc → factorial.md} +1 -1
- data/demo/core/integer/{length.rdoc → length.md} +1 -1
- data/demo/core/integer/{multiple.rdoc → multiple.md} +3 -1
- data/demo/core/integer/of.md +11 -0
- data/demo/core/integer/{ordinal.rdoc → ordinal.md} +3 -1
- data/demo/core/integer/{of.rdoc → times_collect.md} +2 -7
- data/demo/core/matchdata/match.md +7 -0
- data/demo/core/matchdata/matchset.md +7 -0
- data/demo/core/matchdata/matchtree.md +10 -0
- data/demo/core/module/cattr.md +43 -0
- data/demo/core/module/class_extend.md +64 -0
- data/demo/core/module/{class_inheritor.rdoc → class_inheritor.md} +2 -2
- data/demo/core/module/{copy_inheritor.rdoc → copy_inheritor.md} +4 -4
- data/demo/core/module/include_as.md +31 -0
- data/demo/core/module/method_space.md +24 -0
- data/demo/core/string/acronym.md +9 -0
- data/demo/core/string/{align.rdoc → align.md} +10 -10
- data/demo/core/string/ascii_only.md +37 -0
- data/demo/core/string/{bracket.rdoc → bracket.md} +10 -10
- data/demo/core/string/camelcase.md +47 -0
- data/demo/core/string/{capitalized.rdoc → capitalized.md} +9 -9
- data/demo/core/string/characters.md +11 -0
- data/demo/core/string/{cleanlines.rdoc → cleanlines.md} +3 -3
- data/demo/core/string/cleave.md +49 -0
- data/demo/core/string/compress_lines.md +22 -0
- data/demo/core/string/crypt.md +15 -0
- data/demo/core/string/divide.md +9 -0
- data/demo/core/string/each_word.md +11 -0
- data/demo/core/string/edit_distance.md +15 -0
- data/demo/core/string/exclude.md +15 -0
- data/demo/core/string/expand_tabs.md +69 -0
- data/demo/core/string/fold.md +14 -0
- data/demo/core/string/indent.md +65 -0
- data/demo/core/string/index_all.md +14 -0
- data/demo/core/string/interpolate.md +8 -0
- data/demo/core/string/lchomp.md +14 -0
- data/demo/core/string/line_wrap.md +7 -0
- data/demo/core/string/lowercase.md +12 -0
- data/demo/core/string/methodize.md +22 -0
- data/demo/core/string/modulize.md +22 -0
- data/demo/core/string/mscan.md +10 -0
- data/demo/core/string/natcmp.md +10 -0
- data/demo/core/string/nchar.md +9 -0
- data/demo/core/string/{newlines.rdoc → newlines.md} +3 -3
- data/demo/core/string/number.md +27 -0
- data/demo/core/string/op_div.md +10 -0
- data/demo/core/string/op_sub.md +7 -0
- data/demo/core/string/pathize.md +22 -0
- data/demo/core/string/quote.md +20 -0
- data/demo/core/string/random.md +25 -0
- data/demo/core/string/range.md +19 -0
- data/demo/core/string/remove.md +33 -0
- data/demo/core/string/rewrite.md +9 -0
- data/demo/core/string/shatter.md +9 -0
- data/demo/core/string/similarity.md +12 -0
- data/demo/core/string/snakecase.md +14 -0
- data/demo/core/string/splice.md +28 -0
- data/demo/core/string/squish.md +27 -0
- data/demo/core/string/store.md +10 -0
- data/demo/core/string/subtract.md +8 -0
- data/demo/core/string/titlecase.md +8 -0
- data/demo/core/string/to_re.md +22 -0
- data/demo/core/string/{margin.rdoc → trim.md} +14 -14
- data/demo/core/string/unbracket.md +24 -0
- data/demo/core/string/underscore.md +17 -0
- data/demo/core/string/unfold.md +9 -0
- data/demo/core/string/unindent.md +65 -0
- data/demo/core/string/unquote.md +6 -0
- data/demo/core/string/uppercase.md +15 -0
- data/demo/core/string/variablize.md +7 -0
- data/demo/core/string/word_wrap.md +54 -0
- data/demo/core/string/words.md +13 -0
- data/demo/core/string/xor.md +8 -0
- data/lib/core/facets.yml +11 -7
- data/lib/core/facets/array.rb +1 -0
- data/lib/core/facets/array/average.rb +16 -0
- data/lib/core/facets/array/collapse.rb +4 -0
- data/lib/core/facets/array/delete_values_at.rb +1 -0
- data/lib/core/facets/array/divide.rb +7 -0
- data/lib/core/facets/array/duplicates.rb +2 -0
- data/lib/core/facets/array/each_pair.rb +1 -4
- data/lib/core/facets/array/first.rb +1 -0
- data/lib/core/facets/array/from.rb +11 -16
- data/lib/core/facets/array/intersection.rb +1 -1
- data/lib/core/facets/array/last.rb +1 -0
- data/lib/core/facets/array/mode.rb +2 -2
- data/lib/core/facets/array/occurrence.rb +4 -3
- data/lib/core/facets/array/op_pow.rb +0 -2
- data/lib/core/facets/array/probability.rb +1 -1
- data/lib/core/facets/array/recursively.rb +2 -2
- data/lib/core/facets/array/splice.rb +1 -1
- data/lib/core/facets/array/standard_deviation.rb +23 -0
- data/lib/core/facets/array/to_h.rb +0 -3
- data/lib/core/facets/array/uniq_by.rb +4 -0
- data/lib/core/facets/array/variance.rb +20 -0
- data/lib/core/facets/binding.rb +0 -1
- data/lib/core/facets/enumerable/cluster.rb +6 -4
- data/lib/core/facets/enumerable/hashify.rb +27 -31
- data/lib/core/facets/enumerable/sum.rb +12 -2
- data/lib/core/facets/file/atomic_open.rb +1 -1
- data/lib/core/facets/hash/except.rb +13 -1
- data/lib/core/facets/indexable.rb +1 -1
- data/lib/core/facets/kernel/ergo.rb +3 -3
- data/lib/core/facets/kernel/like.rb +1 -1
- data/lib/core/facets/matchdata/matchtree.rb +2 -0
- data/lib/core/facets/numeric/delimit.rb +20 -0
- data/lib/core/facets/range/nudge.rb +29 -0
- data/lib/core/facets/string.rb +0 -2
- data/lib/core/facets/string/indent.rb +0 -8
- data/lib/core/facets/string/margin.rb +0 -4
- data/lib/core/facets/string/random.rb +13 -3
- data/lib/core/facets/string/similarity.rb +7 -6
- data/lib/standard/facets/enumargs.rb +5 -0
- data/lib/standard/facets/math/percentile.rb +1 -1
- data/lib/standard/facets/net/http.rb +33 -14
- data/lib/standard/facets/timer.rb +3 -3
- data/test/core/array/test_average.rb +16 -0
- data/test/core/array/test_before.rb +21 -0
- data/test/core/array/test_collapse.rb +10 -1
- data/test/core/array/test_delete_unless.rb +17 -0
- data/test/core/array/test_delete_values.rb +31 -0
- data/test/core/array/test_divide.rb +10 -0
- data/test/core/array/test_each_pair.rb +16 -0
- data/test/core/array/test_each_value.rb +16 -0
- data/test/core/array/test_from.rb +42 -0
- data/test/core/array/test_op_pow.rb +13 -0
- data/test/core/array/test_standard_deviation.rb +18 -0
- data/test/core/array/test_to_h.rb +14 -0
- data/test/core/array/test_uniq_by.rb +7 -0
- data/test/core/array/test_variance.rb +17 -0
- data/test/core/array/test_zip.rb +13 -0
- data/test/core/dir/test_each_child.rb +1 -1
- data/test/core/dir/test_multiglob.rb +1 -1
- data/test/core/enumerable/test_cluster.rb +36 -0
- data/test/core/enumerable/test_hashify.rb +113 -0
- data/test/core/hash/test_expect.rb +11 -1
- data/test/core/kernel/test_ergo.rb +7 -5
- data/test/core/{object/test_replace.rb → kernel/test_instance_replace.rb} +6 -28
- data/test/core/numeric/test_delimit.rb +68 -0
- data/test/core/numeric/{test_round.rb → test_round_to.rb} +27 -27
- data/test/core/range/test_nudge.rb +32 -0
- data/test/core/range/{test_to_r.rb → test_to_rng.rb} +3 -3
- data/test/core/string/test_acronym.rb +14 -0
- data/test/core/string/test_ascii_only.rb +21 -0
- data/test/core/string/test_compress_lines.rb +9 -0
- data/test/core/string/test_crypt.rb +17 -0
- data/test/core/string/test_index_all.rb +4 -0
- data/test/core/string/test_random.rb +25 -0
- data/test/core/string/test_remove.rb +14 -0
- data/test/core/string/test_similarity.rb +9 -1
- data/test/core/struct/test_replace.rb +18 -0
- data/test/standard/test_enumargs.rb +26 -10
- data/test/standard/test_timer.rb +1 -1
- metadata +634 -588
- data/CONTRIBUTE.md +0 -78
- data/demo/core/array/combination.rdoc +0 -19
- data/demo/core/array/delete.rdoc +0 -23
- data/demo/core/array/index.rdoc +0 -14
- data/demo/core/array/merge.rdoc +0 -15
- data/demo/core/array/only.rdoc +0 -9
- data/demo/core/array/pad.rdoc +0 -28
- data/demo/core/array/permutation.rdoc +0 -10
- data/demo/core/array/product.rdoc +0 -26
- data/demo/core/array/recursively.rdoc +0 -16
- data/demo/core/array/rotate.rdoc +0 -30
- data/demo/core/array/select.rdoc +0 -8
- data/demo/core/array/uniq_by.rdoc +0 -9
- data/demo/core/binding/caller.rdoc +0 -57
- data/demo/core/binding/defined.rdoc +0 -10
- data/demo/core/binding/eval.rdoc +0 -8
- data/demo/core/binding/local_variables.rdoc +0 -26
- data/demo/core/binding/opvars.rdoc +0 -16
- data/demo/core/binding/self.rdoc +0 -6
- data/demo/core/class/descendants.rdoc +0 -10
- data/demo/core/class/to_proc.rdoc +0 -8
- data/demo/core/comparable/cap.rdoc +0 -20
- data/demo/core/comparable/clip.rdoc +0 -37
- data/demo/core/comparable/cmp.rdoc +0 -18
- data/demo/core/comparable/op_get.rdoc +0 -29
- data/demo/core/dir/ascend.rdoc +0 -24
- data/demo/core/dir/descend.rdoc +0 -14
- data/demo/core/dir/multiglob.rdoc +0 -41
- data/demo/core/dir/parent.rdoc +0 -6
- data/demo/core/dir/recurse.rdoc +0 -41
- data/demo/core/exception/detail.rdoc +0 -12
- data/demo/core/filetest/root.rdoc +0 -6
- data/demo/core/hash/recursively.rdoc +0 -21
- data/demo/core/indexable.rdoc +0 -95
- data/demo/core/integer/bitmask.rdoc +0 -46
- data/demo/core/integer/even.rdoc +0 -12
- data/demo/core/integer/odd.rdoc +0 -12
- data/demo/core/matchdata/match.rdoc +0 -7
- data/demo/core/matchdata/matchset.rdoc +0 -15
- data/demo/core/module/cattr.rdoc +0 -43
- data/demo/core/module/class_extend.rdoc +0 -64
- data/demo/core/module/method_space.rdoc +0 -55
- data/demo/core/string/bytes.rdoc +0 -8
- data/demo/core/string/camelcase.rdoc +0 -47
- data/demo/core/string/characters.rdoc +0 -11
- data/demo/core/string/cleave.rdoc +0 -49
- data/demo/core/string/divide.rdoc +0 -9
- data/demo/core/string/each_char.rdoc +0 -9
- data/demo/core/string/each_word.rdoc +0 -9
- data/demo/core/string/end_with.rdoc +0 -6
- data/demo/core/string/expand_tabs.rdoc +0 -69
- data/demo/core/string/fold.rdoc +0 -14
- data/demo/core/string/indent.rdoc +0 -65
- data/demo/core/string/interpolate.rdoc +0 -7
- data/demo/core/string/lchomp.rdoc +0 -14
- data/demo/core/string/line_wrap.rdoc +0 -7
- data/demo/core/string/lines.rdoc +0 -8
- data/demo/core/string/methodize.rdoc +0 -22
- data/demo/core/string/modulize.rdoc +0 -22
- data/demo/core/string/mscan.rdoc +0 -10
- data/demo/core/string/natcmp.rdoc +0 -10
- data/demo/core/string/nchar.rdoc +0 -9
- data/demo/core/string/op_sub.rdoc +0 -7
- data/demo/core/string/pathize.rdoc +0 -22
- data/demo/core/string/quote.rdoc +0 -20
- data/demo/core/string/range.rdoc +0 -19
- data/demo/core/string/rewrite.rdoc +0 -9
- data/demo/core/string/shatter.rdoc +0 -9
- data/demo/core/string/snakecase.rdoc +0 -10
- data/demo/core/string/splice.rdoc +0 -28
- data/demo/core/string/start_with.rdoc +0 -7
- data/demo/core/string/subtract.rdoc +0 -8
- data/demo/core/string/tab.rdoc +0 -16
- data/demo/core/string/tabto.rdoc +0 -29
- data/demo/core/string/titlecase.rdoc +0 -8
- data/demo/core/string/to_re.rdoc +0 -22
- data/demo/core/string/unfold.rdoc +0 -9
- data/demo/core/string/unindent.rdoc +0 -65
- data/demo/core/string/unquote.rdoc +0 -6
- data/demo/core/string/variablize.rdoc +0 -7
- data/demo/core/string/word_wrap.rdoc +0 -54
- data/demo/core/string/words.rdoc +0 -13
- data/demo/core/string/xor.rdoc +0 -8
- data/lib/core/facets/binding/local_variables.rb +0 -16
- data/lib/core/facets/string/tab.rb +0 -2
- data/lib/core/facets/string/tabto.rb +0 -2
- data/test/core/array/test_after.rb +0 -27
- data/test/core/array/test_combination.rb +0 -25
- data/test/core/array/test_index.rb +0 -20
- data/test/core/array/test_permutation.rb +0 -20
- data/test/core/array/test_product.rb +0 -64
- data/test/core/array/test_rotate.rb +0 -38
- data/test/core/array/test_select.rb +0 -16
- data/test/core/binding/test_eval.rb +0 -15
- data/test/core/binding/test_local_variables.rb +0 -36
- data/test/core/enumerable/test_cluster_by.rb +0 -30
- data/test/core/enumerable/test_count.rb +0 -32
- data/test/core/enumerable/test_each_with_object.rb +0 -18
- data/test/core/enumerable/test_group_by.rb +0 -36
- data/test/core/enumerable/test_none.rb +0 -29
- data/test/core/enumerable/test_one.rb +0 -34
- data/test/core/enumerable/test_take.rb +0 -15
- data/test/core/hash/test_select.rb +0 -44
- data/test/core/hash/test_url_params.rb +0 -26
- data/test/core/integer/test_even.rb +0 -24
- data/test/core/integer/test_odd.rb +0 -24
- data/test/core/kernel/test_require_relative.rb +0 -12
- data/test/core/nilclass/test_to_f.rb +0 -13
- data/test/core/proc/test_curry.rb +0 -38
- data/test/core/string/test_bytes.rb +0 -13
- data/test/core/string/test_each_char.rb +0 -17
- data/test/core/string/test_end_with.rb +0 -24
- data/test/core/string/test_lines.rb +0 -15
- data/test/core/string/test_start_with.rb +0 -24
- data/test/core/string/test_tab.rb +0 -16
- data/test/core/symbol/test_to_proc.rb +0 -35
- data/test/core/to_hash_tc.rb +0 -210
- data/test/core/unboundmethod/test_name.rb +0 -19
@@ -0,0 +1,13 @@
|
|
1
|
+
## Array#after
|
2
|
+
|
3
|
+
require 'facets/array/after'
|
4
|
+
|
5
|
+
`Array#after` returns the first value that comes after a given value. The
|
6
|
+
value after the last is the first. Returns `nil` if the given value is not
|
7
|
+
in the array.
|
8
|
+
|
9
|
+
sequence = ['a', 'b', 'c']
|
10
|
+
sequence.after('a').assert == 'b'
|
11
|
+
sequence.after('b').assert == 'c'
|
12
|
+
sequence.after('c').assert == 'a'
|
13
|
+
sequence.after('d').assert == nil
|
@@ -0,0 +1,17 @@
|
|
1
|
+
## Array#arrange
|
2
|
+
|
3
|
+
require 'facets/array/arrange'
|
4
|
+
|
5
|
+
The `arrange` method produces appropriate ranges from the objects in the array.
|
6
|
+
It assumes inclusive ranges (i.e. `1..4`) and `range.first <= range.last`.
|
7
|
+
|
8
|
+
Works with integers, dates and strings. However, all the objects in the array must
|
9
|
+
be of the same class.
|
10
|
+
|
11
|
+
[1,2,3,6,7,8].arrange.assert == [1..3, 6..8]
|
12
|
+
|
13
|
+
[10..15, 16..20, 21, 22].arrange.assert == [10..22]
|
14
|
+
|
15
|
+
a = %w{a b c g h i j k m o}
|
16
|
+
a.arrange.assert == ['a'..'c','g'..'k', 'm' , 'o']
|
17
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
## Array#before
|
2
|
+
|
3
|
+
require 'facets/array/before'
|
4
|
+
|
5
|
+
Returns the value prior to the given value. The value previous
|
6
|
+
to the first is the last. Returns nil if the given value is not
|
7
|
+
in the array.
|
8
|
+
|
9
|
+
sequence = ['a', 'b', 'c']
|
10
|
+
sequence.before('a').assert == 'c'
|
11
|
+
sequence.before('b').assert == 'a'
|
12
|
+
sequence.before('c').assert == 'b'
|
13
|
+
sequence.before('d').assert == nil
|
14
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
## Array#collapse
|
2
|
+
|
3
|
+
require 'facets/array/collapse'
|
4
|
+
|
5
|
+
Simplify an array by flattening it then compacting it.
|
6
|
+
|
7
|
+
[1,[2,nil,[3]],nil,4].collapse.assert == [1,2,3,4]
|
8
|
+
|
9
|
+
## Array#collapse!
|
10
|
+
|
11
|
+
Simplify an array by flattening it in place then compacting it in place.
|
12
|
+
|
13
|
+
a = [1, nil, [1, 2], nil, [[3]]]
|
14
|
+
a.collapse!
|
15
|
+
a.assert == [1, 1, 2, 3]
|
@@ -0,0 +1,30 @@
|
|
1
|
+
## Array#collisions
|
2
|
+
|
3
|
+
_alias for Array#commonality_.
|
4
|
+
|
5
|
+
require 'facets/array/collisions'
|
6
|
+
|
7
|
+
Get a list of all items that have something in common in terms of the
|
8
|
+
supplied block. If no block is given objects are considered to be in
|
9
|
+
common if they return the same value for Object#hash and if obj1 == obj2.
|
10
|
+
|
11
|
+
This can be useful, for instance, in determining all persons that share
|
12
|
+
their last name with another person.
|
13
|
+
|
14
|
+
Person = Struct.new(:name)
|
15
|
+
persons = %w{Wayne Pennyworth Grayson Wayne Pennyworth}.map{|n| Person.new(n)}
|
16
|
+
persons.collisions { |person| person.name }.keys.assert == ["Wayne","Pennyworth"]
|
17
|
+
|
18
|
+
The method is similar to #group_by which is a standard Ruby method as of 1.9.
|
19
|
+
To get effectively the same results with #group_by use `select{ |k,v| v.size > 1 }`.
|
20
|
+
|
21
|
+
expected = { 2 => [2, 2], 4 => [4, 4] }
|
22
|
+
|
23
|
+
[1, 2, 2, 3, 4, 4].group_by{ |e| e }.
|
24
|
+
select{ |k,v| v.size > 1 }.assert == expected
|
25
|
+
|
26
|
+
[1, 2, 2, 3, 4, 4].collisions.assert == expected
|
27
|
+
|
28
|
+
%w{foo bar baz}.collisions{|str| str[0]}.assert == {'b' =>["bar", "baz"] }
|
29
|
+
|
30
|
+
Returns a Hash mapping common attribute to those elements.
|
@@ -0,0 +1,31 @@
|
|
1
|
+
## Array#commonality
|
2
|
+
|
3
|
+
require 'facets/array/commonality'
|
4
|
+
|
5
|
+
Get a list of all items that have something in common in terms of the
|
6
|
+
supplied block. If no block is given objects are considered to be in
|
7
|
+
common if they return the same value for Object#hash and if obj1 == obj2.
|
8
|
+
|
9
|
+
This can be useful, for instance, in determining all persons that share
|
10
|
+
their last name with another person.
|
11
|
+
|
12
|
+
Person = Struct.new(:name)
|
13
|
+
persons = %w{Wayne Pennyworth Grayson Wayne Pennyworth}.map{|n| Person.new(n)}
|
14
|
+
persons.commonality { |person| person.name }.keys # => ["Wayne","Pennyworth"]
|
15
|
+
|
16
|
+
The method is similar to #group_by which is a standard Ruby method as of 1.9.
|
17
|
+
To get effectively the same results with #group_by use `select{ |k,v| v.size > 1 }`.
|
18
|
+
|
19
|
+
expected = { 2 => [2, 2], 4 => [4, 4] }
|
20
|
+
|
21
|
+
[1, 2, 2, 3, 4, 4].group_by{ |e| e }.
|
22
|
+
select{ |k,v| v.size > 1 }.assert == expected
|
23
|
+
|
24
|
+
[1, 2, 2, 3, 4, 4].commonality.assert == expected
|
25
|
+
|
26
|
+
|
27
|
+
%w{foo bar baz}.commonality{|str| str[0]}.assert == {'b' =>["bar", "baz"] }
|
28
|
+
|
29
|
+
Returns a Hash mapping common attribute to those elements.
|
30
|
+
|
31
|
+
|
@@ -0,0 +1,47 @@
|
|
1
|
+
## Array#conjoin
|
2
|
+
|
3
|
+
require 'facets/array/conjoin'
|
4
|
+
|
5
|
+
This is more advanced form of #join. It allows for fine control
|
6
|
+
of separators.
|
7
|
+
|
8
|
+
NOTE: The old version used to default its separator to ", " and
|
9
|
+
default the terminating separator to " and ". This is no longer
|
10
|
+
the case. You must specifically provide these parameters.
|
11
|
+
|
12
|
+
If no parameters are given, it acts like #join but will a space
|
13
|
+
separator.
|
14
|
+
|
15
|
+
[1,2,3].conjoin.assert == "1 2 3"
|
16
|
+
|
17
|
+
Use comma+space and 'and' on tail.
|
18
|
+
|
19
|
+
[1,2,3].conjoin(', ', ' and ').assert == "1, 2 and 3"
|
20
|
+
|
21
|
+
Use comma+space and 'or' on tail using :last option.
|
22
|
+
|
23
|
+
[1,2,3].conjoin(', ', :last => ' or ').assert == "1, 2 or 3"
|
24
|
+
|
25
|
+
Use semicolon+space and ampersand on tail using index.
|
26
|
+
|
27
|
+
[1,2,3].conjoin('; ', -1 => ' & ').assert == "1; 2 & 3"
|
28
|
+
|
29
|
+
Can take a block to determine separator.
|
30
|
+
|
31
|
+
[1,2,3,4].conjoin{ |i, a, b| i % 2 == 0 ? '.' : '-' }.assert == "1.2-3.4"
|
32
|
+
|
33
|
+
This makes very esoteric transformation possible.
|
34
|
+
|
35
|
+
[1,1,2,2].conjoin{ |i, a, b| a == b ? '=' : ' != ' }.assert == "1=1 != 2=2"
|
36
|
+
|
37
|
+
[1,2,3,4].conjoin{ |i, x, y| "<#{i} #{x} #{y}>" }.assert == "1<0 1 2>2<1 2 3>3<2 3 4>4"
|
38
|
+
|
39
|
+
There are also spacing options. Providing the :space option
|
40
|
+
pads the separators.
|
41
|
+
|
42
|
+
[1,2,3].conjoin(',', '&', :space=>2).assert == "1 , 2 & 3"
|
43
|
+
|
44
|
+
And the :spacer option can set an alternate spacing string.
|
45
|
+
|
46
|
+
[1,2,3].conjoin('|', '>', :space=>2, :spacer=>'-').assert == "1--|--2-->--3"
|
47
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
## Array#delete_unless
|
2
|
+
|
3
|
+
require 'facets/array/delete_unless'
|
4
|
+
|
5
|
+
The method `#delete_unless` is the inverse of `#delete_if`.
|
6
|
+
|
7
|
+
a = [1,2,3]
|
8
|
+
a.delete_unless{ |e| e == 2 }
|
9
|
+
a.assert == [2]
|
10
|
+
|
11
|
+
[1,2,3].delete_unless{ |x| x < 2 }.assert == [1]
|
12
|
+
[1,2,3].delete_unless(&:even?).assert == [2]
|
13
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
## Array#delete_values_at
|
2
|
+
|
3
|
+
require 'facets/array/delete_values_at'
|
4
|
+
|
5
|
+
Delete multiple values from array given
|
6
|
+
indexes or index range.
|
7
|
+
|
8
|
+
a = [1,2,3,4]
|
9
|
+
a.delete_values_at(1,2).assert == [2,3]
|
10
|
+
a.assert == [1,4]
|
11
|
+
|
12
|
+
a = [1,2,3,4]
|
13
|
+
a.delete_values_at(0..2).assert == [1,2,3]
|
14
|
+
a.assert == [4]
|
15
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
## Array#divide
|
2
|
+
|
3
|
+
require 'facets/array/divide'
|
4
|
+
|
5
|
+
Divide into sub arrays at elemetns matching given pattern
|
6
|
+
|
7
|
+
r = ['a1','b1','a2','b2'].divide(/^a/)
|
8
|
+
r.assert == [['a1','b1'],['a2','b2']]
|
9
|
+
|
10
|
+
r = ['a1','b1','a2','b2'].divide(/^b/)
|
11
|
+
r.assert == [['a1'],['b1','a2'],['b2']]
|
12
|
+
|
13
|
+
r = ['a1','b1','a2','b2'].divide(/c/)
|
14
|
+
r.assert = [['a1','b1','a2','b2']]
|
@@ -0,0 +1,12 @@
|
|
1
|
+
## Array#each_overlap
|
2
|
+
|
3
|
+
require 'facets/array/each_overlap'
|
4
|
+
|
5
|
+
Iterate over each slice where the last n values of a preceding slice
|
6
|
+
overlap with the first n values of the following slice. The value of n
|
7
|
+
is specified by the second `overlap` argument.
|
8
|
+
|
9
|
+
a, r = [1,2,3,4,5], []
|
10
|
+
a.each_overlap(2,1) { |x,y| r << [x,y] }
|
11
|
+
r.assert == [[1,2],[2,3],[3,4],[4,5]]
|
12
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
## Array#each_pair
|
2
|
+
|
3
|
+
require 'facets/array/each_pair'
|
4
|
+
|
5
|
+
Iterate over an array yielding with index and value.
|
6
|
+
|
7
|
+
result = {}
|
8
|
+
a = [:a,:b,:c,:d]
|
9
|
+
a.each_pair{|i,e| result[e] = i + 1}
|
10
|
+
result.assert == {a: 1, b: 2, c: 3, d: 4}
|
11
|
+
|
12
|
+
*NOTE* this is the inverse of `Array#each_with_index`, and is intended to provide
|
13
|
+
polymorphism with `Hash#each_pair`.
|
@@ -0,0 +1,12 @@
|
|
1
|
+
## Array#each_value
|
2
|
+
|
3
|
+
require 'facets/array/each_value'
|
4
|
+
|
5
|
+
This is an alias of Alias#each, and is provided to provide polymorphism with
|
6
|
+
Hash#each_value.
|
7
|
+
|
8
|
+
a = [ "a", "b", "c" ]
|
9
|
+
out = ''
|
10
|
+
a.each_value {|x| out += "#{x} -- " }
|
11
|
+
out.assert == 'a -- b -- c -- '
|
12
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
## Array#entropy
|
2
|
+
|
3
|
+
require 'facets/array/entropy'
|
4
|
+
|
5
|
+
Shannon's entropy for an array - returns the average
|
6
|
+
bits per symbol required to encode the array.
|
7
|
+
Lower values mean less "entropy" - i.e. less unique
|
8
|
+
information in the array.
|
9
|
+
|
10
|
+
e = %w{ a b c d e e e }.entropy
|
11
|
+
|
12
|
+
("%.3f" % e) #=> "2.128"
|
13
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
## Array#extract_options!
|
2
|
+
|
3
|
+
require 'facets/array/extract_options'
|
4
|
+
|
5
|
+
Extracts options from a set of arguments. Removes and returns the last
|
6
|
+
element in the array if it's a hash, otherwise returns a blank hash.
|
7
|
+
|
8
|
+
def options(*args)
|
9
|
+
args.extract_options!
|
10
|
+
end
|
11
|
+
|
12
|
+
options(1, 2).assert == {}
|
13
|
+
options(1, 2, :a => :b).assert == {:a=>:b}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
## Array#ideal_entropy
|
2
|
+
|
3
|
+
require 'facets/array/entropy'
|
4
|
+
|
5
|
+
Returns the maximum possible Shannon entropy of the array
|
6
|
+
with given size assuming that it is an "order-0" source
|
7
|
+
(each element is selected independently of the next).
|
8
|
+
|
9
|
+
%w{ a b }.ideal_entropy.assert == 1.0
|
10
|
+
%w{ a a b b }.ideal_entropy.assert == 2.0
|
11
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
## Array#intersection
|
2
|
+
|
3
|
+
require 'facets/array/intersection'
|
4
|
+
|
5
|
+
Returns the values in common for an array set (nil, single value/object, or range).
|
6
|
+
|
7
|
+
[1,2].intersection.assert == nil
|
8
|
+
[1..10,11..20].intersection.assert == nil
|
9
|
+
[10,1..10].intersection.assert == 10
|
10
|
+
[1..10,5,5..8,4..8].intersection.assert == 5
|
11
|
+
[1..10, 5..8, 5..10 ].intersection.assert == (5..8)
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# Array#median
|
2
|
+
|
3
|
+
require 'facets/array/median'
|
4
|
+
|
5
|
+
Determines the _sorted_ middle element.
|
6
|
+
|
7
|
+
a = %w{a a b b c c c}
|
8
|
+
a.median #=> "b"
|
9
|
+
|
10
|
+
When there are an even number of elements, the greater
|
11
|
+
of the two middle elements is given.
|
12
|
+
|
13
|
+
a = %w{a a b b c c c d}
|
14
|
+
a.median #=> "c"
|
15
|
+
|
16
|
+
An offset can be supplied to get an element relative
|
17
|
+
to the middle.
|
18
|
+
|
19
|
+
a = %w{a a b b c c c d}
|
20
|
+
a.median(-1) #=> "b"
|
21
|
+
|
22
|
+
The the array is empty, +nil+ is returned.
|
23
|
+
|
@@ -0,0 +1,10 @@
|
|
1
|
+
## Array#missing
|
2
|
+
|
3
|
+
require 'facets/array/missing'
|
4
|
+
|
5
|
+
Determine the 'holes' in the values of an array. Returns the missing elements
|
6
|
+
in an array set.
|
7
|
+
|
8
|
+
[1,3..3].missing.assert == [2]
|
9
|
+
[1..5,10..12].missing.assert == [6..9]
|
10
|
+
[100, 9..11, 14, 1..5, 16, 10..12, 17..17].missing.assert == [6..8, 13, 15, 18..99]
|