mll 2.3.0 → 2.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d67aa2bc083ee5926dba5e8ab794ec81579c3d94
4
- data.tar.gz: 54b82009ff7fced4eadbdb48c663e9b046ae368d
3
+ metadata.gz: 4578ca0a16a98bc1a8ab3336d073e3520b85cdc9
4
+ data.tar.gz: 78ef02a3c5081a97b4bf7fa7278d0da84d2e4f3a
5
5
  SHA512:
6
- metadata.gz: fdc4e70514e2e323f53cda619ce8b16b4a05f672c05666a1062fb43a53c86d9169df93c0100599fd2725a4802fc5686816160396388ef619a8995bf2b4cef8f4
7
- data.tar.gz: 1e977a6fad2adf25434f6f899b919b71b6df0300032c4029ce8147c00429111e3e06c31972ea60d04726bfc7483bf975c721adec07deda72b9a790efbb67ad31
6
+ metadata.gz: b24b4691ada481ae2150e7f073b5e77f151d38d823a76743dc4bfcd1b0e52b55da52e61b5fdb9855108a6b2e9de3d04a563e9a9b8f1309ae414c88aac267d8db
7
+ data.tar.gz: 4972ad59f90b6cddfd2c000144960a8850571682661037aed329923c21da3325450be4032586816b7462fa10c5f3fbd240d4a7dbd3463876883042b233adf0ce
data/.rspec CHANGED
@@ -1,2 +1 @@
1
- --format documentation
2
1
  --color
data/Gemfile.lock CHANGED
@@ -1,32 +1,30 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mll (2.2.1)
4
+ mll (2.4.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
9
  diff-lcs (1.2.5)
10
- rspec (3.1.0)
11
- rspec-core (~> 3.1.0)
12
- rspec-expectations (~> 3.1.0)
13
- rspec-mocks (~> 3.1.0)
14
- rspec-core (3.1.7)
15
- rspec-support (~> 3.1.0)
16
- rspec-expectations (3.1.2)
10
+ rspec (3.3.0)
11
+ rspec-core (~> 3.3.0)
12
+ rspec-expectations (~> 3.3.0)
13
+ rspec-mocks (~> 3.3.0)
14
+ rspec-core (3.3.2)
15
+ rspec-support (~> 3.3.0)
16
+ rspec-expectations (3.3.1)
17
17
  diff-lcs (>= 1.2.0, < 2.0)
18
- rspec-support (~> 3.1.0)
19
- rspec-mocks (3.1.3)
20
- rspec-support (~> 3.1.0)
21
- rspec-support (3.1.2)
18
+ rspec-support (~> 3.3.0)
19
+ rspec-mocks (3.3.2)
20
+ diff-lcs (>= 1.2.0, < 2.0)
21
+ rspec-support (~> 3.3.0)
22
+ rspec-support (3.3.0)
22
23
 
23
24
  PLATFORMS
24
25
  ruby
25
26
 
26
27
  DEPENDENCIES
27
- bundler (~> 1.7)
28
+ bundler (~> 1.7.0)
28
29
  mll!
29
- rspec (~> 3.1.0)
30
-
31
- BUNDLED WITH
32
- 1.11.2
30
+ rspec (~> 3.3.0)
data/README.md CHANGED
@@ -18,6 +18,7 @@ The main goal is to make Ruby more powerful by including the most used functions
18
18
  4. `::fold_list` was wanted [here](http://stackoverflow.com/q/1475808/322020) in Ruby while being already implemented as [FoldList[]](http://reference.wolfram.com/language/ref/FoldList.html) in Mathematica and [scanl](http://hackage.haskell.org/package/base-4.8.0.0/docs/Prelude.html#v:scanl) in Haskell
19
19
  5. `::nest` (n times) and `::nest_list` for repetitive applying the same function -- `::nest_while` and `::nest_while_list` are going to be implemented later
20
20
  6. `::tally` -- shortcut to a probably the most common usage of `#group_by` -- calculating total occurences.
21
+ 7. TODO write smth about `::riffle`, `::subdivide`, `::grid`
21
22
 
22
23
  ### How
23
24
 
@@ -25,56 +26,82 @@ The main goal is to make Ruby more powerful by including the most used functions
25
26
  MLL::range[[2, 3]] # => [1..2, 1..3]
26
27
  MLL::range[ 1..3 ] # => [1..1, 1..2, 1..3]
27
28
 
29
+ MLL::table[ MLL::times, 9, 9 ]
30
+ # => [[1, 2, 3, 4, 5, 6, 7, 8, 9],
31
+ [2, 4, 6, 8, 10, 12, 14, 16, 18],
32
+ [3, 6, 9, 12, 15, 18, 21, 24, 27],
33
+ [4, 8, 12, 16, 20, 24, 28, 32, 36],
34
+ [5, 10, 15, 20, 25, 30, 35, 40, 45],
35
+ [6, 12, 18, 24, 30, 36, 42, 48, 54],
36
+ [7, 14, 21, 28, 35, 42, 49, 56, 63],
37
+ [8, 16, 24, 32, 40, 48, 56, 64, 72],
38
+ [9, 18, 27, 36, 45, 54, 63, 72, 81]]
39
+
40
+ # similar to Ruby's #product with #map...
28
41
  t = MLL::table[ ->(i,j){ i+j }, [[1, 0, 1]], [[0, 2, 0]] ]
29
42
  # => [[1, 3, 1],
30
43
  [0, 2, 0],
31
44
  [1, 3, 1]]
45
+ # ... but our #map...
32
46
  t = MLL::map[ ->(i){ [i] }, t, [2] ]
33
47
  # => [[ [1], [3], [1] ],
34
48
  [ [0], [2], [0] ],
35
49
  [ [1], [3], [1] ]]
50
+ # ... can go deeper
36
51
  MLL::map[ ->(i){ -i }, t, [3] ]
37
52
  # => [[ [-1], [-3], [-1] ],
38
53
  [ [ 0], [-2], [ 0] ],
39
54
  [ [-1], [-3], [-1] ]]
40
55
 
41
- MLL::table[ MLL::times, 9, 9 ]
42
- # => [[1, 2, 3, 4, 5, 6, 7, 8, 9],
43
- [2, 4, 6, 8, 10, 12, 14, 16, 18],
44
- [3, 6, 9, 12, 15, 18, 21, 24, 27],
45
- [4, 8, 12, 16, 20, 24, 28, 32, 36],
46
- [5, 10, 15, 20, 25, 30, 35, 40, 45],
47
- [6, 12, 18, 24, 30, 36, 42, 48, 54],
48
- [7, 14, 21, 28, 35, 42, 49, 56, 63],
49
- [8, 16, 24, 32, 40, 48, 56, 64, 72],
50
- [9, 18, 27, 36, 45, 54, 63, 72, 81]]
51
56
  # ::times means *
52
57
  # ::divide means /
53
58
  # ::subtract means -
54
59
  # ::plus means +
55
60
 
56
- MLL::fold_list[ MLL::times, MLL::range[10] ]
57
- # => [1,2,6,24,120,720,5040,40320,362880,3628800]
58
-
59
- # here is `Listable' magic, allowing to zip arrays
61
+ # here is another `Listable' magic, allowing to zip arrays
60
62
  # even of different dimensions with basic operations
61
63
  MLL::times[ [[1,2],[3,4]], [5,6] ]
62
64
  # => [[5,10], [18,24]]
65
+
66
+ # listing factorials # http://stackoverflow.com/a/3590520/322020
67
+ MLL::fold_list[ MLL::times, MLL::range[8] ]
68
+ # => [1, 2, 6, 24, 120, 720, 5040, 40320]
63
69
 
70
+ MLL::fold_list[ ->(a,b){ 10*a + b }, 0, [4,5,1,6,7,8] ]
71
+ # => [0, 4, 45, 451, 4516, 45167, 451678]
72
+
64
73
  # http://en.wikipedia.org/wiki/Collatz_conjecture
65
74
  MLL::nest_list[ ->(i){ i.even? ? i/2 : (i*3+1)/2 }, 20, 10 ]
66
75
  # => [20, 10, 5, 8, 4, 2, 1, 2, 1, 2, 1]
67
76
 
68
- MLL::fold_list[ ->(a,b){ 10*a + b }, 0, [4,5,1,6,7,8] ]
69
- # => [0,4,45,451,4516,45167,451678]
77
+ # counting characters and nice printing the resulting table
78
+ MLL::grid[ MLL::tally[ "the quick brown fox jumps over the lazy dog".chars ].
79
+ sort_by(&:last).reverse.take(10),
80
+ frame: :all, spacings: [2, 0] ]
81
+ # => ┏━━━┳━━━┓
82
+ ┃ ┃ 8 ┃
83
+ ┃ o ┃ 4 ┃
84
+ ┃ e ┃ 3 ┃
85
+ ┃ u ┃ 2 ┃
86
+ ┃ h ┃ 2 ┃
87
+ ┃ r ┃ 2 ┃
88
+ ┃ t ┃ 2 ┃
89
+ ┃ n ┃ 1 ┃
90
+ ┃ p ┃ 1 ┃
91
+ ┃ m ┃ 1 ┃
92
+ ┗━━━┻━━━┛
93
+ # current implementation of #grid sucks and needs your help ,.)
94
+
95
+ MLL::riffle[ "4345252523535".chars, ",", [-4,1,-4] ]
96
+ # => "4,345,252,523,535"
70
97
 
71
98
  MLL::subdivide[ 5, 10, 4 ]
72
99
  # => [5.0, 6.25, 7.5, 8.75, 10.0]
73
-
74
- MLL::tally[ "the quick brown fox jumps over the lazy dog".chars ]
75
- # => {"t"=>2, "h"=>2, "e"=>3, " "=>8, "q"=>1, "u"=>2, "i"=>1, "c"=>1, "k"=>1,
76
- "b"=>1, "r"=>2, "o"=>4, "w"=>1, "n"=>1, "f"=>1, "x"=>1, "j"=>1, "m"=>1,
77
- "p"=>1, "s"=>1, "v"=>1, "l"=>1, "a"=>1, "z"=>1, "y"=>1, "d"=>1, "g"=>1}
100
+
101
+ MLL::most[ [1, 2, 3, 4] ] # => [1, 2, 3]
102
+ # now it's possible to extend core classes with some of those methods
103
+ require "mll/core_ext"
104
+ [1, 2, 3, 4].most # => [1, 2, 3]
78
105
 
79
106
  Note that to see some of above examples working in the same way you need `.to_a`, `.map(&:to_a)` or even `.to_a.map(&:to_a)` since lazyness is intensively used.
80
107
 
@@ -90,6 +117,10 @@ or
90
117
 
91
118
  rake spec
92
119
 
120
+ or
121
+
122
+ rake # to implicitly run 'rake todo'
123
+
93
124
  ### TODO (this section is filled automatically by `rake todo` task -- do not remove)
94
125
 
95
126
  #### lib/mll.rb
@@ -121,6 +152,13 @@ module MLL
121
152
  # TODO negative spacings?
122
153
  # TODO smth with this #.all?
123
154
  # TODO https://reference.wolfram.com/language/ref/Alignment.html
155
+ def riffle
156
+ lambda do |*args|
157
+ case args.size
158
+ when 3
159
+ Enumerator.new do |e|
160
+ args[0].each_with_index do |x, i|
161
+ # TODO make it not destructive
124
162
  # TODO not sure if we need any other kind of Listability except of #range[[Array]]
125
163
  # TODO #power[]
126
164
  ```
@@ -145,6 +183,11 @@ describe MLL do
145
183
  # TODO: "Make a triangular array:"
146
184
  describe "#range" do
147
185
  # TODO take from docs more examples that involve other functions
186
+ describe "Rearranging & Restructuring Lists" do
187
+ describe "#riffle" do
188
+ describe "Scope:" do
189
+ example "intersperse two lists" do
190
+ # TODO check how it works for list2.size == list1.size + 1 in Mathematica
148
191
  describe "Applying Functions to Lists" do
149
192
  describe "#fold_list" do
150
193
  describe "Applications:" do
@@ -164,6 +207,8 @@ describe MLL do
164
207
  # TODO #mapthread ?
165
208
  # TODO #mapindexed ?
166
209
  # TODO "negative levels"
210
+ describe "Elements of Lists" do
211
+ # TODO #rest
167
212
  # TODO http://reference.wolfram.com/language/guide/RearrangingAndRestructuringLists.html
168
213
  # TODO http://reference.wolfram.com/language/guide/MathematicalAndCountingOperationsOnLists.html
169
214
  describe "Functional Programming" do
data/core_ext.rb ADDED
@@ -0,0 +1,7 @@
1
+ require_relative "lib/mll"
2
+
3
+ class Array
4
+ def most
5
+ MLL::most[self]
6
+ end
7
+ end
data/lib/mll.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  module MLL
2
2
 
3
+ VERSION = "2.4.1"
4
+
3
5
  class << self
4
6
 
5
7
  def dimensions
@@ -203,23 +205,30 @@ module MLL
203
205
  end
204
206
  end
205
207
 
206
- def define_listable_function name, &block
207
- (class << self; self end).class_eval do
208
- define_method name do
209
- lambda do |*args|
210
- case args.map{ |i| i.respond_to? :map }
211
- when [true] ; args.first.lazy.map &method(name).call
212
- when [true, true] ; args.first.lazy.zip(args.last).map{ |i, j| send(name)[i, j] }
213
- when [true, false] ; args.first.lazy.map{ |i| send(name)[i, args.last] }
214
- when [false, true] ; args.last.lazy.map{ |i| send(name)[args.first, i] }
215
- else
216
- block.call *args
217
- end
208
+ def most
209
+ # not Enumerator because if the end is invisible we can't stop at -2
210
+ lambda do |list|
211
+ list[0..-2]
212
+ end
213
+ end
214
+
215
+ end
216
+
217
+ def self.define_listable_function name, &block
218
+ (class << self; self end).class_eval do
219
+ define_method name do
220
+ lambda do |*args|
221
+ case args.map{ |i| i.respond_to? :map }
222
+ when [true] ; args.first.lazy.map &method(name).call
223
+ when [true, true] ; args.first.lazy.zip(args.last).map{ |i, j| send(name)[i, j] }
224
+ when [true, false] ; args.first.lazy.map{ |i| send(name)[i, args.last] }
225
+ when [false, true] ; args.last.lazy.map{ |i| send(name)[args.first, i] }
226
+ else
227
+ block.call *args
218
228
  end
219
229
  end
220
230
  end
221
231
  end
222
-
223
232
  end
224
233
 
225
234
  # TODO not sure if we need any other kind of Listability except of #range[[Array]]
@@ -269,7 +278,7 @@ module MLL
269
278
 
270
279
  define_orderless_function(:plus, 0) { |a, b| _plus.call a, b }
271
280
  define_orderless_function(:times, 1) { |a, b| _times.call a, b }
272
-
281
+
273
282
  def self.mean
274
283
  lambda do |list|
275
284
  divide[times[plus[*list], 1.0], list.size]
data/mll.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "mll"
3
- spec.version = "2.3.0"
3
+ spec.version = (require_relative "lib/mll"; MLL::VERSION)
4
4
  spec.authors = ["Victor Maslov"]
5
5
  spec.email = ["nakilon@gmail.com"]
6
6
  spec.summary = "Mathematica Language Library in Ruby"
@@ -13,9 +13,9 @@ Gem::Specification.new do |spec|
13
13
  spec.test_files = ["spec/"]
14
14
  # spec.require_paths = ["lib"]
15
15
 
16
- spec.add_development_dependency "bundler", "~> 1.7"
16
+ spec.add_development_dependency "bundler", "~> 1.7.0"
17
17
  # spec.add_development_dependency "rake", "~> 10.0"
18
- spec.add_development_dependency "rspec", "~> 3.1.0"
18
+ spec.add_development_dependency "rspec", "~> 3.3.0"
19
19
 
20
20
  spec.required_ruby_version = ">= 2.0.0"
21
21
  # spec.post_install_message = ""
data/spec/_spec.rb CHANGED
@@ -1,5 +1,4 @@
1
- require_relative File.join "..", "lib", "mll"
2
-
1
+ require_relative "../lib/mll"
3
2
 
4
3
  # PERMATODO test all implemented exceptions
5
4
  # PERMATODO test all types returned (not actually all but about lazyness)
@@ -183,7 +182,7 @@ describe MLL do
183
182
  expect(fold_list[0, [1,2,3], plus]).to be_a Enumerator
184
183
  expect(fold_list[0, [1,2,3], plus].to_a).to eq [0,1,3,6]
185
184
  end
186
-
185
+
187
186
  end
188
187
 
189
188
  end
@@ -798,6 +797,34 @@ describe MLL do
798
797
  # http://reference.wolfram.com/language/guide/ElementsOfLists.html
799
798
  describe "Elements of Lists" do
800
799
 
800
+ # https://reference.wolfram.com/language/ref/Most.html
801
+ describe "#most" do
802
+
803
+ example "#most[expr] is equivalent to Array#[](0..-2)" do
804
+ expect(most[[1,2,3,4]].to_a).to eq [1,2,3,4][0..-2]
805
+ end
806
+
807
+ describe "Basic Examples:" do
808
+
809
+ example "???" do
810
+ expect(most[[1,2,3,4]].to_a).to eq [1,2,3]
811
+ end
812
+
813
+ end
814
+
815
+ describe "Applications:" do
816
+
817
+ example "nest the operation of finding most of a list" do
818
+ expect(nest_list[[1,2,3,4], 3, most].to_a).to eq [[1,2,3,4], [1,2,3], [1,2], [1]]
819
+ end
820
+
821
+ end
822
+
823
+ end
824
+
825
+ # TODO #rest
826
+
827
+ # https://reference.wolfram.com/language/ref/Dimensions.html
801
828
  describe "#dimensions" do
802
829
 
803
830
  describe "Basic Examples:" do
@@ -959,7 +986,7 @@ describe MLL do
959
986
  describe "#tally" do
960
987
 
961
988
  describe "Details:" do
962
-
989
+
963
990
  example "#tally[list] is equivalent to #tally[list,#sameq]" do
964
991
  skip "#sameq is yet to be implemented"
965
992
  end
@@ -1218,7 +1245,7 @@ describe MLL do
1218
1245
  end
1219
1246
 
1220
1247
  end
1221
-
1248
+
1222
1249
  end
1223
1250
 
1224
1251
  describe "Options:" do
@@ -1272,6 +1299,24 @@ end
1272
1299
  # TODO http://reference.wolfram.com/language/guide/HandlingArraysOfData.html
1273
1300
  # TODO http://reference.wolfram.com/language/guide/ComputationWithStructuredDatasets.html
1274
1301
 
1302
+
1303
+ describe "core_ext" do
1304
+
1305
+ example "by default core classes are not patched" do
1306
+ expect{ [1,2,3,4].most }.to raise_error NoMethodError
1307
+ end
1308
+
1309
+ example "after core_ext required" do
1310
+ require_relative "../core_ext"
1311
+ aggregate_failures "everything is fine" do
1312
+ expect([1,2,3,4].most).to eq [1,2,3]
1313
+
1314
+ end
1315
+ end
1316
+
1317
+ end
1318
+
1319
+
1275
1320
  __END__
1276
1321
 
1277
1322
  Table Array
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mll
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Maslov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-06 00:00:00.000000000 Z
11
+ date: 2016-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - ~>
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
19
+ version: 1.7.0
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
- version: '1.7'
26
+ version: 1.7.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ~>
32
32
  - !ruby/object:Gem::Version
33
- version: 3.1.0
33
+ version: 3.3.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ~>
39
39
  - !ruby/object:Gem::Version
40
- version: 3.1.0
40
+ version: 3.3.0
41
41
  description: ''
42
42
  email:
43
43
  - nakilon@gmail.com
@@ -51,6 +51,7 @@ files:
51
51
  - Gemfile.lock
52
52
  - README.md
53
53
  - Rakefile
54
+ - core_ext.rb
54
55
  - lib/mll.rb
55
56
  - mll.gemspec
56
57
  - spec/_spec.rb