array-subindex 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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