array-subindex 1.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: dce6660ba97882e56b1499cccb5ffaa7b163f56c
4
+ data.tar.gz: 342d9a596affd1b653231292780a566a4d343cd4
5
+ SHA512:
6
+ metadata.gz: b8dfc3d648e07ec48deb68697370b249dca2a8959e6a362bb96f339a05619d9e6b0ca2d68246988bff8c35686b467abadcd5e507387f7eb9ee6f2c1644929b7f
7
+ data.tar.gz: bd5744c75a8b42d1adf63ba330ea90cb5e0582691f922ac1176b336c33d690299e18aaeae14e49bb7a2317f2ea2ec188ebeed47d9461496b7476d07a4eaeb7bd
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
@@ -0,0 +1 @@
1
+ array-subindex
@@ -0,0 +1 @@
1
+ ruby-2.0.0
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.3
5
+ - 2.0.0
6
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in array-subindex.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Matthew Nielsen
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,108 @@
1
+ [![Build Status](https://travis-ci.org/xunker/array-subindex.png?branch=master)](https://travis-ci.org/xunker/array-subindex)
2
+ # Array::Subindex
3
+
4
+ Are you tired of The Man getting you down by only letting you use whole
5
+ integers as array indexes? Who isn't, dude! Seriously, who is The Man anyway?
6
+
7
+ Now you can, in Ruby at least:
8
+
9
+ ```ruby
10
+ [1,2,3][0.5] == 1.5
11
+
12
+ %w[ foo bar baz ][1.3] == "arb"
13
+
14
+ [ [1,2], [3,4] ][0.5] == 2.5
15
+ ```
16
+
17
+ The inspiration:
18
+
19
+ <blockquote class="twitter-tweet" lang="en"><p>&quot;Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.&quot; — Stan Kelly-Bootle</p>&mdash; Usman Masood (@usmanm) <a href="https://twitter.com/usmanm/statuses/410449694603485184">December 10, 2013</a></blockquote><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
20
+
21
+ ## Installation
22
+
23
+ You shouldn't really use this gem. Ever. Really, don't.
24
+
25
+ Ok, ok, you can use is as long as you promise to *never* use it in a
26
+ production environment. Clear? Good.
27
+
28
+ $ gem install array-subindex
29
+
30
+ ..then..
31
+
32
+ ```ruby
33
+ require 'array/subindex'
34
+ ```
35
+
36
+ ## Usage
37
+
38
+ This gem overrides the Ruby core Array#[] method. That is insanse. If a
39
+ "normal" integer is used, the method behaves as normal:
40
+
41
+ ```ruby
42
+ [1,2][0] == 1
43
+ ```
44
+
45
+ However, if the method detects that a number is passed that is not an integer
46
+ (but still a valid number class), the method will return an equivilent value
47
+ from the array.
48
+
49
+ In the case of an array of numbers (int, float, real), it gets portions of the
50
+ adjacent indexes, adds them, and returns them. For example:
51
+
52
+ ```ruby
53
+ [1,2,3][1.5] == 2.5
54
+ # 1/2 of index 2 + 1/2 of index 3
55
+ ```
56
+
57
+ It also works for unequal devisions (e.g. indexes other than 0.5):
58
+
59
+ ```ruby
60
+ [1,2,3][0.25] == 1.75
61
+ # 1/4 of index 0 + 3/4 of index 1
62
+ ```
63
+
64
+ In the case of irrational divisions, the results are rounded:
65
+
66
+ ```ruby
67
+ [1,2,3][1.001] == 2.999
68
+ but rounded to 2.999
69
+ ```
70
+
71
+ For arrays of strings, a concatination of portions of the values are used:
72
+
73
+ ```ruby
74
+ [ "this", "is", "a", "test" ][0.5] == "isi"
75
+ # 1/2 of index 0 ("is") added to half of index 1 ("i")
76
+ ```
77
+
78
+ For unevenly dividable strings, the index is rounded down:
79
+
80
+ ```ruby
81
+ [ "foo", "bar", "baz" ][0.5] == "oob"
82
+ ```
83
+
84
+ _BONUS LEVEL_
85
+
86
+ For arrays that contain arrays, hashes, or anything that responds like an
87
+ array, we will get the appropriate index values in those and then concat
88
+ or add them as appropriate:
89
+
90
+ ```ruby
91
+ [ [ 1, 2 ], [ 3, 4] ][0.5] == 2.5
92
+ # [2] + [3], then 0.5 of result
93
+
94
+ [ [ "foo", "bar" ], [ "baz", "qux" ] ][0.5] == "arb"
95
+ # 1/2 of "bar" (rounded up to 2/3) + 1/2 of "baz" (rounded down to 1/3)
96
+
97
+ # works with hashes, too!
98
+ [ ['foo'], { bar: 'baz' } ][0.5] == 'oobar'
99
+ # 1/2 of "foo" round up to 2/3 + hash.to_a -> 1/2 of first value
100
+ ```
101
+
102
+ ## License
103
+
104
+ Distributed under the [WTFPL](https://github.com/rlespinasse/WTFPL) license.
105
+
106
+ ## Contributing
107
+
108
+ 1. Don't. Stop encouraging me to commit these kinds of sin.
@@ -0,0 +1,11 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require "rspec/core/rake_task"
4
+ require "rspec/core/version"
5
+
6
+ task :default => :spec
7
+
8
+ desc "Run all examples"
9
+ RSpec::Core::RakeTask.new(:spec, :default) do |t|
10
+ t.ruby_opts = %w[-w]
11
+ end
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'array/subindex/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "array-subindex"
8
+ spec.version = Array::Subindex::VERSION
9
+ spec.authors = ["Matthew Nielsen"]
10
+ spec.email = ["xunker@pyxidis.org"]
11
+ spec.description = %q{Access sub-integer array indexes in Ruby: Array.new([1,2])[0.5] == 1.5}
12
+ spec.summary = %q{Access sub-integer array indexes in Ruby: Array.new([1,2])[0.5] == 1.5}
13
+ spec.homepage = "https://github.com/xunker/array-subindex"
14
+ spec.license = "WTFPL"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+ # spec.add_development_dependency "debugger"
25
+ end
@@ -0,0 +1,77 @@
1
+ require "array/subindex/version"
2
+
3
+ class Array
4
+ def [](index)
5
+ if (subindex = index.to_f - index.to_i) > 0
6
+ f = index.to_f.floor
7
+ c = index.to_f.ceil
8
+ f_value = self.fetch(f)
9
+ c_value = self.fetch(c)
10
+
11
+ f_value = array_subset(f_value, subindex, :to_end) if
12
+ array_like?(f_value)
13
+ c_value = array_subset(c_value, subindex, :from_beginning) if
14
+ array_like?(c_value)
15
+
16
+ if (numeric?(f_value) && numeric?(c_value))
17
+ subindex_as_number(subindex, f_value, c_value)
18
+ else
19
+ subindex_as_string(subindex, f_value, c_value)
20
+ end
21
+ else
22
+ self.fetch(index)
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def subindex_as_number(subindex, f_value, c_value)
29
+ f_fractional = f_value.to_f * subindex
30
+ c_fractional = c_value.to_f * (1.0 - subindex)
31
+ f_fractional + c_fractional
32
+ end
33
+
34
+ def subindex_as_string(subindex, f_value, c_value)
35
+ f_value = f_value.to_s
36
+ c_value = c_value.to_s
37
+ f_index = (f_value.length * subindex).to_i
38
+ c_index = (c_value.length * (1.0 - subindex)).to_i
39
+ [
40
+ f_value.slice(f_index, f_value.length-1),
41
+ c_value.slice(0, c_index)
42
+ ].join
43
+ end
44
+
45
+ def numeric?(test)
46
+ (test.class != String) && (!!(test.to_s =~ /[\d\.\/]+/))
47
+ end
48
+
49
+ def array_like?(test)
50
+ test.respond_to?(:to_a)
51
+ end
52
+
53
+ def array_subset(value, subindex, direction)
54
+ value = value.to_a
55
+ subarray = if value.size <= 1
56
+ value
57
+ else
58
+ index = (value.length.to_f * subindex).to_i
59
+ subarray = case direction.to_sym
60
+ when :to_end
61
+ value.slice(index, value.size-1)
62
+ when :from_beginning
63
+ value.slice(0, index)
64
+ else
65
+ raise "unknown direction :#{direction}"
66
+ end
67
+ subarray
68
+ end
69
+
70
+ if subarray.all?{ |a| numeric?(a) }
71
+ subarray.inject(:+)
72
+ else
73
+ subarray.join
74
+ end
75
+ end
76
+
77
+ end
@@ -0,0 +1,5 @@
1
+ class Array
2
+ module Subindex
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
@@ -0,0 +1,118 @@
1
+ require 'spec_helper'
2
+
3
+ require 'array/subindex'
4
+ describe 'Array::subindex' do
5
+ describe 'preserve previous functionality' do
6
+ subject { [1,2,3] }
7
+ it "returns normal index values with integer indexes" do
8
+ expect(subject[0]).to eq(1)
9
+ expect(subject[1]).to eq(2)
10
+ expect(subject[2]).to eq(3)
11
+
12
+ expect(subject[-1]).to eq(3)
13
+ end
14
+ end
15
+
16
+ context "adjacent values are numeric" do
17
+ subject { [1,2,3] }
18
+ it "will add parts equally" do
19
+ # half of index 1 + half of index 2
20
+ expect(
21
+ subject[1.5]
22
+ ).to eq( 1.0 + 1.5)
23
+ end
24
+
25
+ it "will add parts unequally" do
26
+ # 1/4 of index 0 + 3/4 of index 1
27
+ expect(
28
+ subject[0.25]
29
+ ).to eq( 0.25 + 1.5)
30
+ end
31
+
32
+ it "will round values" do
33
+ # expect 0.001 of index 1 and 0.998 index 2, but rounded to 2.999
34
+ expect(
35
+ subject[1.001]
36
+ ).to eq( 2.999)
37
+ end
38
+ end
39
+
40
+ context "adjacent values are strings" do
41
+ subject { %w{ this is a test } }
42
+ it "concats fractional strings equally" do
43
+ expect(
44
+ subject[0.5]
45
+ ).to eq(
46
+ "isi"
47
+ )
48
+ end
49
+
50
+ it "concats fractional strings unequally" do
51
+ expect(
52
+ subject[0.25]
53
+ ).to eq(
54
+ "hisi"
55
+ )
56
+ end
57
+
58
+ it "rounds uneven indexes down" do
59
+ uneven_length_strings = %w{ foo bar baz }
60
+
61
+ expect(
62
+ uneven_length_strings[0.5]
63
+ ).to eq(
64
+ "oob"
65
+ )
66
+ end
67
+ end
68
+
69
+ context "adjacent values are mix of string and numeric" do
70
+ subject { ["foo", 100] }
71
+
72
+ it "will treat all elements as strings" do
73
+ expect(
74
+ subject[0.5]
75
+ ).to eq(
76
+ "oo1"
77
+ )
78
+ end
79
+ end
80
+
81
+ context "array contains elements that are array-like" do
82
+ context "array-like element is full of numbers" do
83
+ subject { [ [ 1, 2 ], [ 3, 4] ] }
84
+ it "returns the array indexes added together" do
85
+ # [2] + [3], then 0.5 of result
86
+ expect(
87
+ subject[0.5]
88
+ ).to eq(
89
+ 2.5
90
+ )
91
+ end
92
+ end
93
+
94
+ context "array-like element is not numbers" do
95
+ subject { [ %w[foo bar], %w[baz qux] ] }
96
+ it "will return concatenated strings" do
97
+ expect(
98
+ subject[0.5]
99
+ ).to eq(
100
+ "arb"
101
+ )
102
+
103
+ end
104
+ end
105
+ end
106
+
107
+ context "an adjacent value is numeric/string/array" do
108
+ subject { [ ['foo'], { :bar => 'baz' } ] }
109
+ it "will coerce them in to strings" do
110
+ expect(
111
+ subject[0.5]
112
+ ).to eq(
113
+ 'oobar'
114
+ )
115
+ end
116
+ end
117
+
118
+ end
@@ -0,0 +1,3 @@
1
+ RSpec.configure do |config|
2
+ config.order = "random"
3
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: array-subindex
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Matthew Nielsen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-12-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: 'Access sub-integer array indexes in Ruby: Array.new([1,2])[0.5] == 1.5'
56
+ email:
57
+ - xunker@pyxidis.org
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - .gitignore
63
+ - .ruby-gemset
64
+ - .ruby-version
65
+ - .travis.yml
66
+ - Gemfile
67
+ - LICENSE.txt
68
+ - README.md
69
+ - Rakefile
70
+ - array-subindex.gemspec
71
+ - lib/array/subindex.rb
72
+ - lib/array/subindex/version.rb
73
+ - spec/lib/array/subindex_spec.rb
74
+ - spec/spec_helper.rb
75
+ homepage: https://github.com/xunker/array-subindex
76
+ licenses:
77
+ - WTFPL
78
+ metadata: {}
79
+ post_install_message:
80
+ rdoc_options: []
81
+ require_paths:
82
+ - lib
83
+ required_ruby_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - '>='
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ requirements: []
94
+ rubyforge_project:
95
+ rubygems_version: 2.0.6
96
+ signing_key:
97
+ specification_version: 4
98
+ summary: 'Access sub-integer array indexes in Ruby: Array.new([1,2])[0.5] == 1.5'
99
+ test_files:
100
+ - spec/lib/array/subindex_spec.rb
101
+ - spec/spec_helper.rb