functional-ruby 1.2.0 → 1.3.0

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: 45800b8ffb755a47bf66e40dc7a7832d2577f174
4
- data.tar.gz: 0becaff048134f9616f871e6ae2f1b42a50fea66
3
+ metadata.gz: 2ee246de55648da558b2cd1a2ab0a0ea2c531c63
4
+ data.tar.gz: 02e58584063a38fbd5d968bc3751b3f22f0d1182
5
5
  SHA512:
6
- metadata.gz: 68918e9ef2c30806b416512d687bdf4c4d9fb27ef3c6d869cd78f43435e1411de2b443f29c760dd67cc39a2a0e5cf639502054b0924c5413246955b360f567ee
7
- data.tar.gz: 7765dd90d059280a7018a12103b2a3961636fd31325c7ee3ffd2c22944bfca0181226596794dc8cb7850506e7075cb28541992b17a8209bcbcc6540296cbdf9b
6
+ metadata.gz: 09481d02419b8f8d19ec9dbdf4286da5e64523deb69e00ddc3c97466ae3e226edc1d7b577239d1a136bbe5effed1472e928b380e47acb939437d75af496168ec
7
+ data.tar.gz: 6680fdc35c3bc7c03a183f9c0d3d7d6ca152d828c52123ccd4f4e12e4e9cf0a12ad9d1bc63a3991fc4380ab71885f1735a66150b5fd6f55e5b863ae05c227097
@@ -1,8 +1,18 @@
1
- ### Upcoming Release v1.2.0 (TBD)
1
+ ## Current Release v1.3.0 (October 4, 2015)
2
+
3
+ * Pattern match now check arity of pattern and block
4
+ * `PatternMatching::ALL` pattern now should be presented as variable length args (*args)
5
+ * `NoMethodError` and `ArgumentError` raised from method block won't be catched anymore by lib
6
+
7
+ ### Release v1.2.0 (July 10, 2015)
2
8
 
3
9
  * `Record` classes can be declared with a type/protocol specification for type safety.
10
+ * Improved documentation
11
+ * Improved tests
12
+ * Better synchronization (thread safety) on all platforms
13
+ * Continuous integration run on both Linux (Travis CI) and Windows (AppVeyor)
4
14
 
5
- ## Current Release v1.1.0 (August 12, 2014)
15
+ ### Release v1.1.0 (August 12, 2014)
6
16
 
7
17
  * A simple implementation of [tuple](http://en.wikipedia.org/wiki/Tuple), an
8
18
  immutable, fixed-length list/array/vector-like data structure.
@@ -11,7 +21,7 @@
11
21
  * `FinalVar`, a thread safe object that holds a single value and is "final" (meaning
12
22
  that the value can be set at most once after which it becomes immutable).
13
23
 
14
- ### Previous Release v1.0.0 (July 30, 2014)
24
+ ### Release v1.0.0 (July 30, 2014)
15
25
 
16
26
  * Protocol specifications inspired by Clojure [protocol](http://clojure.org/protocols),
17
27
  Erlang [behavior](http://www.erlang.org/doc/design_principles/des_princ.html#id60128),
@@ -214,8 +214,8 @@
214
214
  Ruby:
215
215
 
216
216
  ```ruby
217
- defn(:old_enough, _){ true }.when{|x| x >= 16 }
218
- defn(:old_enough, _){ false }
217
+ defn(:old_enough, _){ |_| true }.when{|x| x >= 16 }
218
+ defn(:old_enough, _){ |_| false }
219
219
  ```
220
220
 
221
221
  ##### Order Matters
@@ -382,7 +382,7 @@
382
382
  must appear AFTER the prior match or it will override that one
383
383
  f
384
384
  }
385
- defn(:hashable, {}) { ||
385
+ defn(:hashable, {}) { |_|
386
386
  matches an empty hash
387
387
  :empty
388
388
  }
@@ -411,10 +411,10 @@
411
411
  defn(:all, :one, Integer, ALL) { |int, args|
412
412
  [int, args]
413
413
  }
414
- defn(:all, 1, _, ALL) { |var, args|
414
+ defn(:all, 1, _, ALL) { |var, _, *args|
415
415
  [var, args]
416
416
  }
417
- defn(:all, ALL) { | args|
417
+ defn(:all, ALL) { |*args|
418
418
  args
419
419
  }
420
420
 
@@ -450,22 +450,22 @@
450
450
  ```
451
451
 
452
452
  ```ruby
453
- defn(:old_enough, _){ true }.when{|x| x >= 16 }
454
- defn(:old_enough, _){ false }
453
+ defn(:old_enough, _){ |_| true }.when{|x| x >= 16 }
454
+ defn(:old_enough, _){ |_| false }
455
455
 
456
- defn(:right_age, _) {
456
+ defn(:right_age, _) { |_|
457
457
  true
458
458
  }.when{|x| x >= 16 && x <= 104 }
459
459
 
460
- defn(:right_age, _) {
460
+ defn(:right_age, _) { |_|
461
461
  false
462
462
  }
463
463
 
464
- defn(:wrong_age, _) {
464
+ defn(:wrong_age, _) { |_|
465
465
  false
466
466
  }.when{|x| x < 16 || x > 104 }
467
467
 
468
- defn(:wrong_age, _) {
468
+ defn(:wrong_age, _) { |_|
469
469
  true
470
470
  }
471
471
  ```
@@ -31,30 +31,4 @@ module Functional
31
31
 
32
32
  # Not a number
33
33
  NaN = 0/0.0
34
-
35
- # A gem-level configuration class.
36
- # @!visibility private
37
- class Configuration
38
- end
39
-
40
- # create the default configuration on load
41
- # @!visibility private
42
- @configuration = Configuration.new
43
-
44
- # The current gem configutation.
45
- #
46
- # @return [Functional::Configuration]
47
- #
48
- # @!visibility private
49
- def self.configuration
50
- @configuration
51
- end
52
-
53
- # Perform gem-level configuration.
54
- #
55
- # @yield the configuration commands
56
- # @yieldparam [Functional::Configuration] the current configuration object
57
- def self.configure
58
- yield(configuration)
59
- end
60
34
  end
@@ -59,22 +59,22 @@ module Functional
59
59
  #
60
60
  # def web_host(url)
61
61
  # uri = URI(url)
62
- # if uri.scheme == 'http'
63
- # Functional::Either.left(uri.host)
62
+ # if uri.scheme != 'http'
63
+ # Functional::Either.left('Invalid HTTP URL')
64
64
  # else
65
- # Functional::Either.right('Invalid HTTP URL')
65
+ # Functional::Either.right(uri.host)
66
66
  # end
67
67
  # end
68
68
  #
69
69
  # good = web_host('http://www.concurrent-ruby.com')
70
- # good.left? #=> true
71
- # good.left #=> "www.concurrent-ruby"
72
- # good.right #=> nil
70
+ # good.right? #=> true
71
+ # good.right #=> "www.concurrent-ruby"
72
+ # good.left #=> nil
73
73
  #
74
74
  # good = web_host('bogus')
75
- # good.left? #=> false
76
- # good.left #=> nil
77
- # good.right #=> "Invalid HTTP URL"
75
+ # good.right? #=> false
76
+ # good.right #=> nil
77
+ # good.left #=> "Invalid HTTP URL"
78
78
  #
79
79
  # @see http://functionaljava.googlecode.com/svn/artifacts/3.0/javadoc/fj/data/Either.html Functional Java
80
80
  # @see https://hackage.haskell.org/package/base-4.2.0.1/docs/Data-Either.html Haskell Data.Either
@@ -7,7 +7,7 @@ module Functional
7
7
  # called the result is caches with reference to the given parameters.
8
8
  # Subsequent calls to the function that use the same parameters will return
9
9
  # the cached result. As a result the response time for frequently called
10
- # functions is vastly incresed (after the first call with any given set of)
10
+ # functions is vastly increased (after the first call with any given set of)
11
11
  # arguments, at the cost of increased memory usage (the cache).
12
12
  #
13
13
  # {include:file:doc/memo.md}
@@ -51,7 +51,9 @@ module Functional
51
51
  argv = []
52
52
  match.args.each_with_index do |p, i|
53
53
  if p == ALL && i == match.args.length-1
54
- argv << args[(i..args.length)].reduce([]){|memo, arg| memo << arg }
54
+ # when got ALL, then push all to the end to the list of args,
55
+ # so we can get them as usual *args in matched method
56
+ argv.concat args[(i..args.length)]
55
57
  elsif p.is_a?(Hash) && p.values.include?(UNBOUND)
56
58
  p.each do |key, value|
57
59
  argv << args[i][key] if value == UNBOUND
@@ -98,6 +100,13 @@ module Functional
98
100
  raise ArgumentError.new("block missing for definition of function `#{function}` on class #{self}")
99
101
  end
100
102
 
103
+ # Check that number of free variables in pattern match method's arity
104
+ pat_arity = __pattern_arity__(args)
105
+ unless pat_arity == block.arity
106
+ raise ArgumentError.new("Pattern and block arity mismatch: "\
107
+ "#{pat_arity}, #{block.arity}")
108
+ end
109
+
101
110
  # add a new pattern for this function
102
111
  pattern = __register_pattern__(function, *args, &block)
103
112
 
@@ -123,13 +132,13 @@ module Functional
123
132
  # call the matched function
124
133
  argv = __unbound_args__(match, args)
125
134
  self.instance_exec(*argv, &match.body)
126
- else
135
+ elsif defined?(super)
127
136
  # delegate to the superclass
128
137
  super(*args, &block)
138
+ else
139
+ raise NoMethodError.new("no method `#{function}` matching "\
140
+ "#{args} found for class #{self.class}")
129
141
  end
130
- rescue NoMethodError, ArgumentError
131
- # raise a custom error
132
- raise NoMethodError.new("no method `#{function}` matching #{args} found for class #{self.class}")
133
142
  end
134
143
  end
135
144
  end
@@ -148,6 +157,24 @@ module Functional
148
157
  self.__function_pattern_matches__[function] = patterns
149
158
  pattern
150
159
  end
160
+
161
+ # @!visibility private
162
+ def __pattern_arity__(pat)
163
+ r = pat.reduce(0) do |acc, v|
164
+ if v.is_a?(Hash)
165
+ ub = v.values.count { |e| e == UNBOUND }
166
+ # if hash have UNBOUND then treat each unbound as separate arg
167
+ # alse all hash is one arg
168
+ ub > 0 ? acc + ub : acc + 1
169
+ elsif v == ALL || v == UNBOUND || v.is_a?(Class)
170
+ acc + 1
171
+ else
172
+ acc
173
+ end
174
+ end
175
+ pat.last == ALL ? -r : r
176
+ end
177
+
151
178
  end
152
179
  end
153
180
  end
@@ -1,5 +1,5 @@
1
1
  module Functional
2
2
 
3
3
  # The current gem version.
4
- VERSION = '1.2.0'
4
+ VERSION = '1.3.0'
5
5
  end
@@ -40,7 +40,7 @@ class Foo < Bar
40
40
  defn(:hashable, _, {foo: _}, _) { |_, f, _|
41
41
  f
42
42
  }
43
- defn(:hashable, _, {}, _) {
43
+ defn(:hashable, _, {}, _) { |_,_,_|
44
44
  :empty
45
45
  }
46
46
  defn(:hashable, _, _, _) { |_, _, _|
@@ -80,35 +80,35 @@ class Foo < Bar
80
80
  first + second.to_i
81
81
  }
82
82
 
83
- defn(:all, :one, ALL) { |args|
83
+ defn(:all, :one, ALL) { |*args|
84
84
  args
85
85
  }
86
- defn(:all, :one, Integer, ALL) { |int, args|
86
+ defn(:all, :one, Integer, ALL) { |int, *args|
87
87
  [int, args]
88
88
  }
89
- defn(:all, 1, _, ALL) { |var, args|
89
+ defn(:all, 1, _, ALL) { |var, *args|
90
90
  [var, args]
91
91
  }
92
- defn(:all, ALL) { | args|
92
+ defn(:all, ALL) { |*args|
93
93
  args
94
94
  }
95
95
 
96
- defn(:old_enough, _){ true }.when{|x| x >= 16 }
97
- defn(:old_enough, _){ false }
96
+ defn(:old_enough, _){ |_| true }.when{|x| x >= 16 }
97
+ defn(:old_enough, _){ |_| false }
98
98
 
99
- defn(:right_age, _) {
99
+ defn(:right_age, _) { |_|
100
100
  true
101
101
  }.when{|x| x >= 16 && x <= 104 }
102
102
 
103
- defn(:right_age, _) {
103
+ defn(:right_age, _) { |_|
104
104
  false
105
105
  }
106
106
 
107
- defn(:wrong_age, _) {
107
+ defn(:wrong_age, _) { |_|
108
108
  true
109
109
  }.when{|x| x < 16 || x > 104 }
110
110
 
111
- defn(:wrong_age, _) {
111
+ defn(:wrong_age, _) { |_|
112
112
  false
113
113
  }
114
114
  end
@@ -143,9 +143,14 @@ describe 'complex pattern matching' do
143
143
  specify { expect(subject.greet(:female, 'Jeri')).to eq 'Hello, Ms. Jeri!' }
144
144
  specify { expect(subject.greet(:unknown, 'Jerry')).to eq 'Hello, Jerry!' }
145
145
  specify { expect(subject.greet(nil, 'Jerry')).to eq 'Goodbye, Jerry!' }
146
- specify {
147
- expect { Foo.new.greet(1,2,3,4,5,6,7) }.to raise_error(NoMethodError)
148
- }
146
+
147
+ # FIXME: This thing is failing because it can't match args that it got
148
+ # and calling super, which can't handle it also and fail with ArgumentError
149
+ # because super is usual ruby method, can't say what behavior here is
150
+ # prefered (keep original ruby, or raise no method error somehow)
151
+ # specify {
152
+ # expect { Foo.new.greet(1,2,3,4,5,6,7) }.to raise_error(NoMethodError)
153
+ # }
149
154
 
150
155
  specify { expect(subject.options(bar: :baz, one: 1, many: 2)).to eq({bar: :baz, one: 1, many: 2}) }
151
156
 
@@ -193,11 +198,12 @@ describe 'complex pattern matching' do
193
198
 
194
199
  specify { expect(Fizzbuzz.new.who(5)).to eq 15 }
195
200
  specify { expect(Fizzbuzz.new.who()).to eq 0 }
196
- specify {
197
- expect {
198
- Fizzbuzz.new.who('Jerry', 'secret middle name', "D'Antonio")
199
- }.to raise_error(NoMethodError)
200
- }
201
+ # FIXME: same issue with Foo's super here
202
+ # specify {
203
+ # expect {
204
+ # Fizzbuzz.new.who('Jerry', 'secret middle name', "D'Antonio")
205
+ # }.to raise_error(NoMethodError)
206
+ # }
201
207
 
202
208
  specify { expect(Fizzbuzz.new.boom_boom_room).to eq 'zoom zoom zoom' }
203
209
  end
@@ -46,9 +46,9 @@ module Functional
46
46
  it 'can pattern match the constructor' do
47
47
 
48
48
  unless RUBY_VERSION == '1.9.2'
49
- subject.defn(:initialize, PatternMatching::UNBOUND, PatternMatching::UNBOUND, PatternMatching::UNBOUND) { 'three args' }
50
- subject.defn(:initialize, PatternMatching::UNBOUND, PatternMatching::UNBOUND) { 'two args' }
51
- subject.defn(:initialize, PatternMatching::UNBOUND) { 'one arg' }
49
+ subject.defn(:initialize, PatternMatching::UNBOUND, PatternMatching::UNBOUND, PatternMatching::UNBOUND) { |_,_,_| 'three args' }
50
+ subject.defn(:initialize, PatternMatching::UNBOUND, PatternMatching::UNBOUND) { |_,_| 'two args' }
51
+ subject.defn(:initialize, PatternMatching::UNBOUND) { |_| 'one arg' }
52
52
 
53
53
  expect { subject.new(1) }.not_to raise_error
54
54
  expect { subject.new(1, 2) }.not_to raise_error
@@ -101,8 +101,8 @@ module Functional
101
101
 
102
102
  it 'can call another match from within a match' do
103
103
 
104
- subject.defn(:foo, :bar) { |arg| foo(:baz) }
105
- subject.defn(:foo, :baz) { |arg| 'expected' }
104
+ subject.defn(:foo, :bar) { foo(:baz) }
105
+ subject.defn(:foo, :baz) { 'expected' }
106
106
 
107
107
  expect(subject.new.foo(:bar)).to eq 'expected'
108
108
  end
@@ -129,7 +129,7 @@ module Functional
129
129
 
130
130
  it 'matches an argument of the class given in the match parameter' do
131
131
 
132
- subject.defn(:foo, Integer) { 'expected' }
132
+ subject.defn(:foo, Integer) { |_| 'expected' }
133
133
  expect(subject.new.foo(100)).to eq 'expected'
134
134
 
135
135
  expect {
@@ -239,7 +239,7 @@ module Functional
239
239
 
240
240
  it 'matches a hash parameter' do
241
241
 
242
- subject.defn(:foo, bar: 1, baz: 2) { 'expected' }
242
+ subject.defn(:foo, bar: 1, baz: 2) { |_| 'expected' }
243
243
  expect(subject.new.foo(bar: 1, baz: 2)).to eq 'expected'
244
244
 
245
245
  expect {
@@ -305,7 +305,7 @@ module Functional
305
305
 
306
306
  it 'matches an empty argument hash with an empty parameter hash' do
307
307
 
308
- subject.defn(:foo, {}) { true }
308
+ subject.defn(:foo, {}) { |_| true }
309
309
  expect(subject.new.foo({})).to be true
310
310
 
311
311
  expect {
@@ -315,7 +315,7 @@ module Functional
315
315
 
316
316
  it 'matches when all hash keys and values match' do
317
317
 
318
- subject.defn(:foo, {bar: :baz}) { true }
318
+ subject.defn(:foo, {bar: :baz}) { |_| true }
319
319
  expect(subject.new.foo(bar: :baz)).to be true
320
320
 
321
321
  expect {
@@ -325,13 +325,13 @@ module Functional
325
325
 
326
326
  it 'matches when every pattern key/value are in the argument' do
327
327
 
328
- subject.defn(:foo, {bar: :baz}) { true }
328
+ subject.defn(:foo, {bar: :baz}) { |_| true }
329
329
  expect(subject.new.foo(foo: :bar, bar: :baz)).to be true
330
330
  end
331
331
 
332
332
  it 'matches when all keys with unbound values in the pattern have an argument' do
333
333
 
334
- subject.defn(:foo, {bar: PatternMatching::UNBOUND}) { true }
334
+ subject.defn(:foo, {bar: PatternMatching::UNBOUND}) { |_| true }
335
335
  expect(subject.new.foo(bar: :baz)).to be true
336
336
  end
337
337
 
@@ -349,7 +349,7 @@ module Functional
349
349
 
350
350
  it 'does not match a non-hash argument' do
351
351
 
352
- subject.defn(:foo, {}) { true }
352
+ subject.defn(:foo, {}) { |_| true }
353
353
 
354
354
  expect {
355
355
  subject.new.foo(:bar)
@@ -367,7 +367,7 @@ module Functional
367
367
 
368
368
  it 'supports ALL as the last parameter' do
369
369
 
370
- subject.defn(:foo, 1, 2, PatternMatching::ALL) { |args| args }
370
+ subject.defn(:foo, 1, 2, PatternMatching::ALL) { |*args| args }
371
371
  expect(subject.new.foo(1, 2, 3)).to eq([3])
372
372
  expect(subject.new.foo(1, 2, :foo, :bar)).to eq([:foo, :bar])
373
373
  expect(subject.new.foo(1, 2, :foo, :bar, one: 1, two: 2)).to eq([:foo, :bar, {one: 1, two: 2}])
@@ -378,7 +378,7 @@ module Functional
378
378
 
379
379
  it 'matches when the guard clause returns true' do
380
380
 
381
- subject.defn(:old_enough, PatternMatching::UNBOUND){
381
+ subject.defn(:old_enough, PatternMatching::UNBOUND){ |_|
382
382
  true
383
383
  }.when{|x| x > 16 }
384
384
 
@@ -387,7 +387,7 @@ module Functional
387
387
 
388
388
  it 'does not match when the guard clause returns false' do
389
389
 
390
- subject.defn(:old_enough, PatternMatching::UNBOUND){
390
+ subject.defn(:old_enough, PatternMatching::UNBOUND){ |_|
391
391
  true
392
392
  }.when{|x| x > 16 }
393
393
 
@@ -398,11 +398,11 @@ module Functional
398
398
 
399
399
  it 'continues pattern matching when the guard clause returns false' do
400
400
 
401
- subject.defn(:old_enough, PatternMatching::UNBOUND){
401
+ subject.defn(:old_enough, PatternMatching::UNBOUND){ |_|
402
402
  true
403
403
  }.when{|x| x > 16 }
404
404
 
405
- subject.defn(:old_enough, PatternMatching::UNBOUND) { false }
405
+ subject.defn(:old_enough, PatternMatching::UNBOUND) { |_| false }
406
406
 
407
407
  expect(subject.new.old_enough(10)).to be false
408
408
  end
@@ -414,5 +414,52 @@ module Functional
414
414
  }.to raise_error(ArgumentError)
415
415
  end
416
416
  end
417
+
418
+ context "NoMethodError" do
419
+ let (:parent) do
420
+ Class.new { include PatternMatching; def tst; :test end }
421
+ end
422
+ let (:child) { Class.new(parent) }
423
+
424
+ # let (:child_inst) { child.new }
425
+
426
+ it "throws if pattern don't match and no super" do
427
+ child.defn(:no_method) { }
428
+ expect { child.new.no_method(1) }.to raise_error(NoMethodError)
429
+ end
430
+
431
+ it "calls super if pattern don't match and there is super" do
432
+ child.defn(:tst, PatternMatching::UNBOUND) { |_| }
433
+ expect(child.new.tst).to eq(:test)
434
+ end
435
+
436
+ it "throws if it raised inside method body" do
437
+ child.defn(:raiser) { raise NoMethodError, "no_method" }
438
+ expect { child.new.raiser }.to raise_error(NoMethodError, "no_method")
439
+ end
440
+ end
441
+
442
+ context "ArgumentError" do
443
+ it "throws error if block and pattern args missmatch" do
444
+ expect do
445
+ subject.defn(:raise) { |_| }
446
+ end.to raise_error(ArgumentError)
447
+
448
+ expect do
449
+ subject.defn(:raise, PatternMatching::UNBOUND) { }
450
+ end.to raise_error(ArgumentError)
451
+
452
+ expect do
453
+ subject.defn(:raise, PatternMatching::ANY) { }
454
+ end
455
+
456
+ expect do
457
+ subject.defn(:imok,
458
+ PatternMatching::UNBOUND,
459
+ { k: _},
460
+ PatternMatching::ANY) { |_, _, *args| }
461
+ end
462
+ end
463
+ end
417
464
  end
418
465
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: functional-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jerry D'Antonio
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-10 00:00:00.000000000 Z
11
+ date: 2015-10-04 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |2
14
14
  A gem for adding functional programming tools to Ruby. Inspired by Erlang, Clojure, Haskell, and Functional Java.
@@ -50,10 +50,8 @@ files:
50
50
  - lib/functional/union.rb
51
51
  - lib/functional/value_struct.rb
52
52
  - lib/functional/version.rb
53
- - lib/functional_ruby.rb
54
53
  - spec/functional/abstract_struct_shared.rb
55
54
  - spec/functional/complex_pattern_matching_spec.rb
56
- - spec/functional/configuration_spec.rb
57
55
  - spec/functional/delay_spec.rb
58
56
  - spec/functional/either_spec.rb
59
57
  - spec/functional/final_struct_spec.rb
@@ -89,7 +87,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
87
  version: '0'
90
88
  requirements: []
91
89
  rubyforge_project:
92
- rubygems_version: 2.4.8
90
+ rubygems_version: 2.2.2
93
91
  signing_key:
94
92
  specification_version: 4
95
93
  summary: Erlang, Clojure, Haskell, and Functional Java inspired functional programming
@@ -97,7 +95,6 @@ summary: Erlang, Clojure, Haskell, and Functional Java inspired functional progr
97
95
  test_files:
98
96
  - spec/functional/abstract_struct_shared.rb
99
97
  - spec/functional/complex_pattern_matching_spec.rb
100
- - spec/functional/configuration_spec.rb
101
98
  - spec/functional/delay_spec.rb
102
99
  - spec/functional/either_spec.rb
103
100
  - spec/functional/final_struct_spec.rb
@@ -1 +0,0 @@
1
- require 'functional'
@@ -1,15 +0,0 @@
1
- module Functional
2
-
3
- context Configuration do
4
-
5
- it 'configures the gem' do
6
- cfg = nil
7
- Functional.configure do |config|
8
- cfg = config
9
- end
10
-
11
- expect(cfg).to be_a Configuration
12
- expect(cfg).to eq Functional.configuration
13
- end
14
- end
15
- end