mll 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (8) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +43 -0
  3. data/Gemfile.lock +29 -0
  4. data/README.md +71 -3
  5. data/lib/mll.rb +36 -2
  6. data/mll.gemspec +1 -1
  7. data/spec/_spec.rb +197 -23
  8. metadata +4 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1bfa93d983183ee395ce32f023a9536220884f0d
4
- data.tar.gz: fd3504c892015ccf15a5f451c7877115186a138b
3
+ metadata.gz: 66cecae3ebfe3b1589979a8146bb036f5f8a7203
4
+ data.tar.gz: dd4fd79c9a5684e9cdefa25845a0530c1c897b5a
5
5
  SHA512:
6
- metadata.gz: 38fd3e00c764eae431fa980369b2f7deff86908529343a3fb07fe37ad6c02e354b87e9ebdfd13a1581f9af8b4e3ce7cd00547840b78132a43c2ecede1ffa135d
7
- data.tar.gz: f4f393855791bf20d726cecef3d6858a7f9cde8267b91abd59a413d689b0a3e613113958bab3c3b33205771eec42f56cd8fe7dca8cb9170f737ee2dd69f7a5fe
6
+ metadata.gz: 1b0b5f12be754586a9e65a437924d5ac6153596c9fc5225da5820948b8f1fb10b49b42db02ac89a089f3872b26aba8d8896b5ae5d6bc4479d41398f3dc4ec18c
7
+ data.tar.gz: 5fe76c75a56556b8e77e7855e28d006828fb963e1f943b14a7ec7ab4051c691280f365d25a9bbdb3640b82859bf1816b3f6ef44b033c149fcf89504a5af9ec75
data/.travis.yml ADDED
@@ -0,0 +1,43 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - 2.0.0-p451 # OS X 10.9.4
7
+ - 2.1.0
8
+ - 2.1.2
9
+ - 2.1.3
10
+ - "2.1"
11
+ - 2.2.0
12
+ - "2.2"
13
+ - ruby-head
14
+ - jruby-19mode
15
+ - jruby-head
16
+ - rbx
17
+ - rbx-2
18
+ os:
19
+ - linux
20
+ - osx
21
+ matrix:
22
+ allow_failures:
23
+ - rvm: 1.9.2 # "undefined method `lazy' for []:Array"
24
+ os: linux
25
+ - rvm: 1.9.2 # "Requested binary installation but no rubies are available to download"
26
+ os: osx
27
+ - rvm: 1.9.3 # "undefined method `lazy' for []:Array"
28
+ - rvm: "2.2" # "Requested binary installation but no rubies are available to download"
29
+ os: osx
30
+ - rvm: ruby-head # "undefined method `hexdigest' for #<OpenSSL::Digest:0x007fda73e3b458>"
31
+ os: osx
32
+ - rvm: jruby-19mode # "undefined method `lazy' for []:Array"
33
+ os: linux
34
+ - rvm: jruby-19mode # "Requested binary installation but no rubies are available to download"
35
+ os: osx
36
+ - rvm: jruby-head # 4 failures in #map
37
+ - rvm: rbx # 5 failures
38
+ - rvm: rbx-2 # 5 failures
39
+ env:
40
+ - rvm_max_time_flag=60
41
+ before_install:
42
+ - gem install bundler
43
+ script: rake spec
data/Gemfile.lock ADDED
@@ -0,0 +1,29 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ mll (2.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
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)
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)
22
+
23
+ PLATFORMS
24
+ ruby
25
+
26
+ DEPENDENCIES
27
+ bundler (~> 1.7)
28
+ mll!
29
+ rspec (~> 3.1.0)
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # MLL (Mathematica Language Library)
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/mll.svg)](http://badge.fury.io/rb/mll)
3
+ [![Gem Version](https://badge.fury.io/rb/mll.svg)](http://badge.fury.io/rb/mll)
4
+ [![Build Status](https://travis-ci.org/Nakilon/mll.svg)](https://travis-ci.org/Nakilon/mll)
4
5
 
5
6
  ### What
6
7
 
@@ -99,7 +100,7 @@ module MLL
99
100
  def dimensions
100
101
  lambda do |list, limit = nil|
101
102
  enumerator = Enumerator.new do |e|
102
- while list.map(&:class).uniq == [Array] &&
103
+ while list.all?{ |i| i.respond_to? :each } &&
103
104
  # TODO refactor into depth-first yielding
104
105
  def nest_while
105
106
  # TODO finish me
@@ -115,7 +116,12 @@ module MLL
115
116
  }]].tap do |stack|
116
117
  stack.each do |ai, ri|
117
118
  # TODO try to make #table lazy (Enumerator instead of Array)
119
+ def grid
120
+ lambda do |table, **options|
121
+ # TODO smth with this #.all?
122
+ # TODO https://reference.wolfram.com/language/ref/Alignment.html
118
123
  # TODO not sure if we need any other kind of Listability except of #range[[Array]]
124
+ # TODO #power[]
119
125
  ```
120
126
 
121
127
  #### spec/_spec.rb
@@ -127,6 +133,8 @@ module MLL
127
133
  # TODO ? let(:fake_lambda){ ->(*args){fail} }
128
134
  # TODO rewrite all Lazy#to_a into Lazy#force (it's not recursive and not documented)
129
135
  # TODO maybe make indexes count from 0 not 1
136
+ # TODO merge similar examples
137
+ # TODO deprecate tests that would obviously fail another tests
130
138
  describe MLL do
131
139
  describe "List Manipulation" do
132
140
  describe "Constructing Lists" do
@@ -141,7 +149,7 @@ describe MLL do
141
149
  # TODO maybe move it to README.md
142
150
  describe "#map" do
143
151
  # TODO we'll need less nested mappings when we implement stop on depths depletion
144
- describe "Details and Options:" do
152
+ describe "Details:" do
145
153
  example "levels n1 though n2" do
146
154
  expect(map[[1,[2,[3,[4,[5,6]]]]], [2,4], ->(i){ [i] }].
147
155
  # TODO smth _<>
@@ -161,6 +169,7 @@ describe MLL do
161
169
  # TODO move #nest_list and #fold_list and others here?
162
170
  # TODO examples in README.rb
163
171
  describe "#nest_while" do
172
+ # TODO examples to README.md
164
173
  describe "Details:" do
165
174
  # TODO a lot
166
175
  describe "Scope:" do
@@ -175,6 +184,65 @@ describe MLL do
175
184
  # TODO example "find the next twin prime after 888" do
176
185
  describe "Properties & Relations:" do
177
186
  # TODO "#nest_while can be expressed in terms of a while loop" do
187
+ describe "Numerical Data" do
188
+ describe "#mean" do
189
+ # TODO examples to README.md
190
+ describe "Grids & Tables" do
191
+ describe "#grid" do
192
+ describe "Details:" do
193
+ # TODO SpanFromLeft SpanFromAbove SpanFromBoth
194
+ # TODO The following options can be given
195
+ # TODO Common settings for Frame
196
+ # TODO The spec(k) can have the following forms
197
+ # TODO With ItemSize->Automatic will break elements across multiple lines
198
+ # TODO "settings can be used for BaselinePosition" do
199
+ describe "Scope:" do
200
+ # TODO Draw all the frames in red
201
+ # TODO Put a frame around the first row and column
202
+ # TODO Draw different frames with different styles
203
+ # TODO Put dividers at all horizontal positions
204
+ # TODO Put dividers at all vertical positions
205
+ # TODO Put dividers at the third horizontal and second vertical positions
206
+ # TODO Make the element 4 span the column to its right
207
+ # TODO Make it span three rows
208
+ # TODO Span throughout a 2×2 block
209
+ # TODO Draw the grid with a pink background
210
+ # TODO Alternating pink and yellow at successive horizontal positions
211
+ # TODO Alternating pink and yellow at successive vertical positions
212
+ # TODO Make the grid contents red
213
+ # TODO "set the horizontal spacing between items" do
214
+ # TODO "set the horizontal and vertical spacings" do
215
+ # TODO "grids can be nested" do
216
+ describe "Options:" do
217
+ # TODO "align elements around the center of the grid" do
218
+ # TODO "align numbers on the decimal point" do
219
+ # TODO draw the grid with a pink background
220
+ # TODO Pink and gray backgrounds for the first and second columns
221
+ # TODO An equivalent syntax
222
+ # TODO Pink and gray backgrounds for the first and second rows
223
+ # TODO Alternating pink and gray backgrounds
224
+ # TODO Alternating backgrounds with yellow superimposed in the first and last positions
225
+ # TODO Set the background for specific items
226
+ # TODO Set the background for a subregion of the grid
227
+ # TODO Draw all interior dividers
228
+ # TODO Draw a divider at every other horizontal position
229
+ # TODO Include the final position
230
+ # TODO Draw dividers with specified styles
231
+ # TODO "frame specific elements" do
232
+ # TODO "frame a region" do
233
+ # TODO "make each item a fixed number of character-widths wide" do
234
+ # TODO "ItemSize->All makes all items the same size" do
235
+ # TODO "prevent line-wrapping" do
236
+ # TODO "set one overall style for grid items" do
237
+ # TODO "style specific elements" do
238
+ # TODO "style a region" do
239
+ # TODO "insert no additional space between rows or columns" do
240
+ # TODO "specify spacing with numeric values" do
241
+ # TODO "use different spacings at the first vertical divider" do
242
+ describe "Properties & Relations:" do
243
+ # TODO "the elements of a Grid can be extracted with #[]" do
244
+ describe "Neat examples:" do
245
+ # TODO "a Sudoku grid" do
178
246
  # TODO http://reference.wolfram.com/language/guide/HandlingArraysOfData.html
179
247
  # TODO http://reference.wolfram.com/language/guide/ComputationWithStructuredDatasets.html
180
248
  ```
data/lib/mll.rb CHANGED
@@ -7,7 +7,7 @@ module MLL
7
7
  list = [list]
8
8
  enumerator = Enumerator.new do |e|
9
9
  # String.size shall not pass
10
- while list.map(&:class).uniq == [Array] &&
10
+ while list.all?{ |i| i.respond_to? :each } &&
11
11
  list.map(&:size).uniq.size == 1
12
12
  # TODO refactor into depth-first yielding
13
13
  e << list.first.size
@@ -103,7 +103,7 @@ module MLL
103
103
  # "undefined method `replace' for #<Enumerator::Lazy: []>"
104
104
  ai.replace ri.first.map{ |i|
105
105
  if ri.size == 1
106
- f.call(*ai, i)
106
+ f.respond_to?(:call) ? f.call(*ai, i) : f
107
107
  else
108
108
  [*ai.dup, i].tap{ |t| stack << [t, ri.drop(1)] }
109
109
  end
@@ -114,6 +114,39 @@ module MLL
114
114
  end
115
115
  end
116
116
 
117
+ # http://www.unicode.org/charts/PDF/U2500.pdf
118
+ # https://en.wikipedia.org/wiki/Box_Drawing
119
+ def grid
120
+ lambda do |table, **options|
121
+ raise ArgumentError.new("unknown value of :alignment option '#{options[:alignment]}'") unless \
122
+ alignment = {
123
+ nil => :center,
124
+ :center => :center,
125
+ :left => :ljust,
126
+ :right => :rjust,
127
+ }[options[:alignment]]
128
+ frames = {
129
+ nil => " ",
130
+ true => "┃ ┏┓ ┗┛━ ┃━━┃ ",
131
+ :all => "┃┃┏┓╋┗┛━━┣┳┻┫ ",
132
+ }[options[:frame]]
133
+ raise ArgumentError.new("unknown value of :frame option '#{options[:frame]}'") if options[:frame] && !frames
134
+ # TODO smth with this #.all?
135
+ table = [table] unless table.all?{ |e| e.respond_to? :each }
136
+ width = table.map(&:size).max - 1
137
+ strings = table.map{ |row| row.dup.tap{ |a| a[width] = a[width] }.map(&:to_s) }
138
+ sizes = strings.transpose.map{ |col| col.map(&:size).max }
139
+ # TODO https://reference.wolfram.com/language/ref/Alignment.html
140
+ [
141
+ [frames[2], sizes.map{ |size| frames[7] * size }.join(frames[10]), frames[3]].join,
142
+ strings.map{ |row| [frames[0], row.zip(sizes).map{ |str, size| str.method(alignment).call size }.join(frames[1]), frames[0]].join }.join(
143
+ [?\n, frames[9], sizes.map{ |size| frames[8] * size }.join(frames[4]), frames[12], ?\n].join
144
+ ),
145
+ [frames[5], sizes.map{ |size| frames[7] * size }.join(frames[11]), frames[6]].join,
146
+ ].join(?\n) + ?\n
147
+ end
148
+ end
149
+
117
150
  def define_listable_function name, &block
118
151
  (class << self; self end).class_eval do
119
152
  define_method name do
@@ -175,6 +208,7 @@ module MLL
175
208
  define_listable_function(:divide) { |*args| raise ArgumentError.new("need two arguments") unless args.size == 2 ; args[0] / args[1] }
176
209
  define_listable_function(:_plus) { |*args| raise ArgumentError.new("need two arguments") unless args.size == 2 ; args[0] + args[1] }
177
210
  define_listable_function(:_times) { |*args| raise ArgumentError.new("need two arguments") unless args.size == 2 ; args[0] * args[1] }
211
+ # TODO #power[]
178
212
  # define_listable_function (:power) { |*args| raise ArgumentError.new("need two arguments") unless args.size == 2 ; args[0] ** args[1] }
179
213
 
180
214
  # http://reference.wolfram.com/language/ref/Orderless.html
data/mll.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "mll"
3
- spec.version = "2.1.0"
3
+ spec.version = "2.2.0"
4
4
  spec.authors = ["Victor Maslov"]
5
5
  spec.email = ["nakilon@gmail.com"]
6
6
  spec.summary = "Mathematica Language Library in Ruby"
data/spec/_spec.rb CHANGED
@@ -18,6 +18,13 @@ require_relative File.join "..", "lib", "mll"
18
18
 
19
19
  # TODO maybe make indexes count from 0 not 1
20
20
 
21
+ # TODO merge similar examples
22
+ # TODO deprecate tests that would obviously fail another tests
23
+
24
+
25
+ # File.read("spec/_spec.rb").scan(/.*\n/).each_with_index{ |e,i| p [i+1,e] if e["\xe2\x80\x90"] || e["\xc3\x97"] }; 0
26
+
27
+
21
28
  # http://reference.wolfram.com/language/guide/LanguageOverview.html
22
29
  describe MLL do
23
30
 
@@ -51,7 +58,7 @@ describe MLL do
51
58
 
52
59
  describe "Scope:" do
53
60
 
54
- example "threads elementwise over lists" do
61
+ example "threads element-wise over lists" do
55
62
  expect(subtract[[1,2,3,4],0.5]).to be_a Enumerator
56
63
  expect(subtract[[1,2,3,4],0.5].to_a).to eq [0.5,1.5,2.5,3.5]
57
64
  expect(subtract[6,[3,2]]).to be_a Enumerator
@@ -92,7 +99,7 @@ describe MLL do
92
99
 
93
100
  describe "Scope:" do
94
101
 
95
- example "threads elementwise over lists" do
102
+ example "threads element-wise over lists" do
96
103
  expect(divide[[2,3,4,5],2.0]).to be_a Enumerator
97
104
  expect(divide[[2,3,4,5],2.0].to_a).to eq [1,1.5,2,2.5]
98
105
  expect(divide[6,[3,2]]).to be_a Enumerator
@@ -140,7 +147,7 @@ describe MLL do
140
147
  example "sums numbers" do
141
148
  expect(plus[2,3,4]).to eq 9
142
149
  end
143
- example "threads elementwise over lists" do
150
+ example "threads element-wise over lists" do
144
151
  # idk why not in Scope
145
152
  expect(plus[[3,4,5],2]).to be_a Enumerator
146
153
  expect(plus[[3,4,5],2].to_a).to eq [5,6,7]
@@ -154,7 +161,7 @@ describe MLL do
154
161
 
155
162
  describe "Scope:" do
156
163
 
157
- example "threads elementwise over lists" do
164
+ example "threads element-wise over lists" do
158
165
  expect(plus[[10,20,30],[1,2,3]]).to be_a Enumerator
159
166
  expect(plus[[10,20,30],[1,2,3]].to_a).to eq [11,22,33]
160
167
  expect(plus[[[1,2],[3,4]],5]).to be_a Enumerator
@@ -198,7 +205,7 @@ describe MLL do
198
205
  example "multiplies numbers" do
199
206
  expect(times[2,3,4]).to eq 24
200
207
  end
201
- example "threads elementwise over lists" do
208
+ example "threads element-wise over lists" do
202
209
  expect(times[[3,4,5],2]).to be_a Enumerator
203
210
  expect(times[[3,4,5],2].to_a).to eq [6,8,10]
204
211
  expect(times[2,3,[4,5]]).to be_a Enumerator
@@ -211,7 +218,7 @@ describe MLL do
211
218
 
212
219
  describe "Scope:" do
213
220
 
214
- example "threads elementwise over lists" do
221
+ example "threads element-wise over lists" do
215
222
  expect(times[[2,3],[4,5]]).to be_a Enumerator
216
223
  expect(times[[2,3],[4,5]].to_a).to eq [8,15]
217
224
  expect(times[[[1,2],[3,4]],5]).to be_a Enumerator
@@ -257,14 +264,18 @@ describe MLL do
257
264
  expect(table[->(i){ i+2 }, [0, 20, 2]]).to be_a Array
258
265
  expect(table[->(i){ i+2 }, [0, 20, 2]]).to eq [2,4,6,8,10,12,14,16,18,20,22]
259
266
  end
260
- example "make a 4×3 matrix" do
267
+ example "a list of 10 x's" do
268
+ expect(table[?x, 10]).to be_a Array
269
+ expect(table[?x, 10]).to eq [?x]*10
270
+ end
271
+ example "make a 4x3 matrix" do
261
272
  expect(table[->(i,j){ 10*i + j }, 4, 3]).to be_a Array
262
273
  expect(table[->(i,j){ 10*i + j }, 4, 3]).to eq [[11,12,13],[21,22,23],[31,32,33],[41,42,43]]
263
274
  end
264
275
 
265
276
  end
266
277
 
267
- example "table(lambda, n1, min..max, [max, min, -step])" do
278
+ example "table[lambda, n1, min..max, [max, min, -step]]" do
268
279
  expect(table[->(i,j,k){ [i,j,k] }, 3, 2..3, [5, 1, -2]]).to be_a Array
269
280
  expect(table[->(i,j,k){ [i,j,k] }, 3, 2..3, [5, 1, -2]]).to eq \
270
281
  [
@@ -289,7 +300,7 @@ describe MLL do
289
300
 
290
301
  describe "Applications:" do
291
302
 
292
- example "column table(binomial, )" do
303
+ example "column table[binomial, ]" do
293
304
  skip "#binomial and #column are yet to be implemented"
294
305
  end
295
306
 
@@ -323,15 +334,15 @@ describe MLL do
323
334
 
324
335
  describe "Basic Examples:" do
325
336
 
326
- example "range(n)" do
337
+ example "range[n]" do
327
338
  expect(range[4]).to be_a Enumerator
328
339
  expect(range[4].to_a).to eq [1,2,3,4]
329
340
  end
330
- example "range(n1, n2)" do
341
+ example "range[n1, n2]" do
331
342
  expect(range[2,5]).to be_a Enumerator
332
343
  expect(range[2,5].to_a).to eq [2,3,4,5]
333
344
  end
334
- example "range(min, max, step)" do
345
+ example "range[min, max, step]" do
335
346
  expect(range[1,2,0.5]).to be_a Enumerator
336
347
  expect(range[1,2,0.5].to_a).to eq [1,1.5,2] # can be precision problems
337
348
  expect(range[2,6,2].to_a).to eq [2,4,6]
@@ -341,7 +352,7 @@ describe MLL do
341
352
  end
342
353
 
343
354
  # NOTE: Wolfram Mathematica can't do this
344
- example "range(max, min, -step)" do
355
+ example "range[max, min, -step]" do
345
356
  expect(range[10,-5,-2]).to be_a Enumerator
346
357
  expect(range[10,-5,-2].to_a).to eq [10,8,6,4,2,0,-2,-4]
347
358
  expect(range[3,1,-1].to_a).to eq [3,2,1]
@@ -381,7 +392,7 @@ describe MLL do
381
392
 
382
393
  end
383
394
 
384
- example "range(min..max)" do
395
+ example "range[min..max]" do
385
396
  expect(range[1..3]).to be_a Enumerator
386
397
  range[1..3].each do |i|
387
398
  expect(i).to be_a Enumerator
@@ -446,7 +457,7 @@ describe MLL do
446
457
  end
447
458
 
448
459
  # NOTE: Wolfram Mathematica can't do this
449
- example "subdivide(max, min, n)" do
460
+ example "subdivide[max, min, n]" do
450
461
  expect(subdivide[1,-1,8]).to be_a Enumerator
451
462
  expect(subdivide[1,-1,8].to_a).to eq [1,0.75,0.5,0.25,0,-0.25,-0.5,-0.75,-1]
452
463
  end
@@ -455,7 +466,7 @@ describe MLL do
455
466
 
456
467
  describe "Properties & Relations:" do
457
468
 
458
- example "subdivide[xmin,xmax,n] is equivalent to xmin+(xmax-xmin)Range[0,n]/n" do
469
+ example "subdivide[xmin, xmax, n] is equivalent to xmin+(xmax-xmin)Range[0,n]/n" do
459
470
  expect(subdivide[2,10,4].to_a).to eq plus[2,divide[times[10-2,range[0,4]],4]].to_a
460
471
  end
461
472
 
@@ -618,7 +629,7 @@ describe MLL do
618
629
 
619
630
  # TODO we'll need less nested mappings when we implement stop on depths depletion
620
631
 
621
- describe "Details and Options:" do
632
+ describe "Details:" do
622
633
 
623
634
  example "levels n1 though n2" do
624
635
  expect(map[[1,[2,[3,[4,[5,6]]]]], [2,4], ->(i){ [i] }]).to be_a Enumerator
@@ -791,6 +802,8 @@ describe MLL do
791
802
  # http://reference.wolfram.com/language/ref/NestWhile.html
792
803
  describe "#nest_while" do
793
804
 
805
+ # TODO examples to README.md
806
+
794
807
  describe "Details:" do
795
808
  # TODO a lot
796
809
  end
@@ -869,12 +882,10 @@ describe MLL do
869
882
  expect(tally[[1, 1, 2, 1, 3, 2, 1]]).to be_a Hash
870
883
  expect(tally[[1, 1, 2, 1, 3, 2, 1]]).to eq({1=>4, 2=>2, 3=>1})
871
884
  end
872
-
873
885
  example "use test argument to count elements with the same class" do
874
886
  expect(tally[[[1,2], [1,2,3,4], 1, [1,2,3,4], 1], ->(i,j){ i.class == j.class }]).to be_a Hash
875
887
  expect(tally[[[1,2], [1,2,3,4], 1, [1,2,3,4], 1], ->(i,j){ i.class == j.class }]).to eq({[1,2]=>3, 1=>2})
876
888
  end
877
-
878
889
  example "count the instances of randomly generated integers" do
879
890
  expect(( r = Random.new(0); tally[Array.new(50){ r.rand 10 }] )).to be_a Hash
880
891
  expect(( r = Random.new(0); tally[Array.new(50){ r.rand 10 }] )).to eq({5=>4, 0=>6, 3=>10, 7=>7, 9=>5, 2=>4, 4=>3, 6=>2, 8=>5, 1=>4})
@@ -887,7 +898,6 @@ describe MLL do
887
898
  example "elements with highest frequencies are given by #commonest" do
888
899
  skip "#commonest is yet to be implemented"
889
900
  end
890
-
891
901
  example "#tally is a discrete analog of #bincounts" do
892
902
  skip "#bincounts is yet to be implemented"
893
903
  end
@@ -899,7 +909,9 @@ describe MLL do
899
909
  # http://reference.wolfram.com/language/ref/Mean.html
900
910
  describe "#mean" do
901
911
 
902
- describe "Basic Examples" do
912
+ # TODO examples to README.md
913
+
914
+ describe "Basic Examples:" do
903
915
 
904
916
  example "mean of numeric values" do
905
917
  expect(mean[[1.21, 3.4, 2.15, 4, 1.55]]).to eq 2.462
@@ -911,7 +923,7 @@ describe MLL do
911
923
 
912
924
  end
913
925
 
914
- describe "Applications" do
926
+ describe "Applications:" do
915
927
 
916
928
  example "a 90-day moving mean" do
917
929
  skip "#moving_map is yet to be implemented"
@@ -919,7 +931,7 @@ describe MLL do
919
931
 
920
932
  end
921
933
 
922
- describe "Properties & Relations" do
934
+ describe "Properties & Relations:" do
923
935
 
924
936
  example "#moving_average is a sequence of means" do
925
937
  skip "#moving_average is yet to be implemented"
@@ -931,6 +943,168 @@ describe MLL do
931
943
 
932
944
  end
933
945
 
946
+ # https://reference.wolfram.com/language/guide/GridsAndTables.html
947
+ describe "Grids & Tables" do
948
+
949
+ # https://reference.wolfram.com/language/ref/Grid.html
950
+ describe "#grid" do
951
+
952
+ describe "Details:" do
953
+
954
+ example "#normal[grid] extracts the list of lists that make up a grid" do
955
+ skip "#normal is yet to be implemented"
956
+ end
957
+ example "the lists do not all need to be the same length" do
958
+ expect(grid[[[1],[2,3]]].to_s).to eq " \n 1 \n \n 2 3 \n \n"
959
+ end
960
+ # TODO SpanFromLeft SpanFromAbove SpanFromBoth
961
+ # TODO The following options can be given
962
+ # TODO Common settings for Frame
963
+ # TODO The spec(k) can have the following forms
964
+ # TODO With ItemSize->Automatic will break elements across multiple lines
965
+ # TODO "settings can be used for BaselinePosition" do
966
+
967
+ end
968
+
969
+ describe "Basic examples:" do
970
+
971
+ example "display elements in a grid" do
972
+ expect(grid[[%w{a b c}, %w{x y z}]]).to eq \
973
+ " \n" \
974
+ " a b c \n" \
975
+ " \n" \
976
+ " x y z \n" \
977
+ " \n"
978
+ end
979
+ example "put a frame around every element" do
980
+ expect(grid[[%w{a b c}, %w{x y z}], frame: :all]).to eq \
981
+ "┏━┳━┳━┓\n" \
982
+ "┃a┃b┃c┃\n" \
983
+ "┣━╋━╋━┫\n" \
984
+ "┃x┃y┃z┃\n" \
985
+ "┗━┻━┻━┛\n"
986
+ end
987
+
988
+ end
989
+
990
+ describe "Scope:" do
991
+
992
+ example "create a grid with a single row" do
993
+ expect(grid[fold_list[range[5], times].to_a]).to eq \
994
+ " \n" \
995
+ " 1 2 6 24 120 \n" \
996
+ " \n"
997
+ end
998
+ example "put a frame around the whole grid" do
999
+ expect(grid[table[?x, [3], [7]], frame: true]).to eq \
1000
+ "┏━━━━━━━━━━━━━┓\n" \
1001
+ "┃x x x x x x x┃\n" \
1002
+ "┃ ┃\n" \
1003
+ "┃x x x x x x x┃\n" \
1004
+ "┃ ┃\n" \
1005
+ "┃x x x x x x x┃\n" \
1006
+ "┗━━━━━━━━━━━━━┛\n"
1007
+ end
1008
+ example "put a frame around every element" do
1009
+ expect(grid[table[?x, [3], [7]], frame: :all]).to eq \
1010
+ "┏━┳━┳━┳━┳━┳━┳━┓\n" \
1011
+ "┃x┃x┃x┃x┃x┃x┃x┃\n" \
1012
+ "┣━╋━╋━╋━╋━╋━╋━┫\n" \
1013
+ "┃x┃x┃x┃x┃x┃x┃x┃\n" \
1014
+ "┣━╋━╋━╋━╋━╋━╋━┫\n" \
1015
+ "┃x┃x┃x┃x┃x┃x┃x┃\n" \
1016
+ "┗━┻━┻━┻━┻━┻━┻━┛\n"
1017
+ end
1018
+ # TODO Draw all the frames in red
1019
+ # TODO Put a frame around the first row and column
1020
+ # TODO Draw different frames with different styles
1021
+ # TODO Put dividers at all horizontal positions
1022
+ # TODO Put dividers at all vertical positions
1023
+ # TODO Put dividers at the third horizontal and second vertical positions
1024
+ # TODO Make the element 4 span the column to its right
1025
+ # TODO Make it span three rows
1026
+ # TODO Span throughout a 2×2 block
1027
+ example "align contents to the left" do
1028
+ expect(grid[[["a", "bbbb"], ["ccc", "d"]], frame: :all, alignment: :left]).to eq \
1029
+ "┏━━━┳━━━━┓\n" \
1030
+ "┃a ┃bbbb┃\n" \
1031
+ "┣━━━╋━━━━┫\n" \
1032
+ "┃ccc┃d ┃\n" \
1033
+ "┗━━━┻━━━━┛\n"
1034
+ end
1035
+ example "align contents to the right" do
1036
+ expect(grid[[["a", "bbbb"], ["ccc", "d"]], frame: :all, alignment: :right]).to eq \
1037
+ "┏━━━┳━━━━┓\n" \
1038
+ "┃ a┃bbbb┃\n" \
1039
+ "┣━━━╋━━━━┫\n" \
1040
+ "┃ccc┃ d┃\n" \
1041
+ "┗━━━┻━━━━┛\n"
1042
+ end
1043
+ # TODO Draw the grid with a pink background
1044
+ # TODO Alternating pink and yellow at successive horizontal positions
1045
+ # TODO Alternating pink and yellow at successive vertical positions
1046
+ # TODO Make the grid contents red
1047
+ example "leave the same amount of space for all items" do
1048
+ skip "#power is yet to be implemented"
1049
+ expect(grid[table[power, [5, 5]], frame: :all, alignment: :right, itemsize: :all]).to eq \
1050
+ "┏━━━┳━━━━┓\n" \
1051
+ "┃ a┃bbbb┃\n" \
1052
+ "┣━━━╋━━━━┫\n" \
1053
+ "┃ccc┃ d┃\n" \
1054
+ "┗━━━┻━━━━┛\n"
1055
+ end
1056
+ # TODO "set the horizontal spacing between items" do
1057
+ # TODO "set the horizontal and vertical spacings" do
1058
+ # TODO "grids can be nested" do
1059
+
1060
+ end
1061
+
1062
+ describe "Options:" do
1063
+
1064
+ # TODO "align elements around the center of the grid" do
1065
+ # TODO "align numbers on the decimal point" do
1066
+ # TODO draw the grid with a pink background
1067
+ # TODO Pink and gray backgrounds for the first and second columns
1068
+ # TODO An equivalent syntax
1069
+ # TODO Pink and gray backgrounds for the first and second rows
1070
+ # TODO Alternating pink and gray backgrounds
1071
+ # TODO Alternating backgrounds with yellow superimposed in the first and last positions
1072
+ # TODO Set the background for specific items
1073
+ # TODO Set the background for a subregion of the grid
1074
+ # TODO Draw all interior dividers
1075
+ # TODO Draw a divider at every other horizontal position
1076
+ # TODO Include the final position
1077
+ # TODO Draw dividers with specified styles
1078
+ # TODO "frame specific elements" do
1079
+ # TODO "frame a region" do
1080
+ # TODO "make each item a fixed number of character-widths wide" do
1081
+ # TODO "ItemSize->All makes all items the same size" do
1082
+ # TODO "prevent line-wrapping" do
1083
+ # TODO "set one overall style for grid items" do
1084
+ # TODO "style specific elements" do
1085
+ # TODO "style a region" do
1086
+ # TODO "insert no additional space between rows or columns" do
1087
+ # TODO "specify spacing with numeric values" do
1088
+ # TODO "use different spacings at the first vertical divider" do
1089
+
1090
+ end
1091
+
1092
+ describe "Properties & Relations:" do
1093
+
1094
+ # TODO "the elements of a Grid can be extracted with #[]" do
1095
+
1096
+ end
1097
+
1098
+ describe "Neat examples:" do
1099
+
1100
+ # TODO "a Sudoku grid" do
1101
+
1102
+ end
1103
+
1104
+ end
1105
+
1106
+ end
1107
+
934
1108
  end
935
1109
 
936
1110
  # TODO http://reference.wolfram.com/language/guide/HandlingArraysOfData.html
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.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Maslov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-18 00:00:00.000000000 Z
11
+ date: 2015-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -46,7 +46,9 @@ extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
48
  - .rspec
49
+ - .travis.yml
49
50
  - Gemfile
51
+ - Gemfile.lock
50
52
  - README.md
51
53
  - Rakefile
52
54
  - lib/mll.rb