monad-maybe 0.9.3 → 0.9.4

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: 4b83febe6374c7006a9d08b6245aabdeb489b0ba
4
- data.tar.gz: a1dcc208247490a63bccfd2664991ccee1616e1b
3
+ metadata.gz: e61e65884a865a598567f36add94bbba7907ab3f
4
+ data.tar.gz: b2d2f6ec6625ccf1c61fbf8a888bd6cbd76342be
5
5
  SHA512:
6
- metadata.gz: a589a26010e6e95de784bff1312d83e38c9b6a433135c36ef20a7cb04a44b2d03c862d1216b95b1e2b442738960e0f187611bd1cc70238802d72b46506e9cb74
7
- data.tar.gz: 234a28c4ce91a6f91a2d7e47da0d3b4964c5c7a76d01ea60e3107359a20c8d282d326f31f69d97442b5a4b67e311b02dd3d1030a5eae64a67330e303c20ec0f7
6
+ metadata.gz: cc6b56d0da004ab51a7d042cf7e8a8797de1716bd993a3eab98e42c1bb7d1dc8360119155802772f5f51ce53c87353cd060c19a4b1b3a79ade4df5d24fab2595
7
+ data.tar.gz: ad3ab76350f0d63b6a879d45e80b2e063aac9ad802092ae3530e1e4c3dbdde666949733de7c2a8f3fc07f99586aa4c6ae834f055de1a5716c1a3b549fe6ee548
data/Rakefile CHANGED
@@ -1,3 +1,4 @@
1
+ require 'rake/testtask'
1
2
  require 'jeweler'
2
3
  Jeweler::Tasks.new do |gem|
3
4
  # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
@@ -21,3 +22,7 @@ desc "Setup for development"
21
22
  task :setup do
22
23
  sh "bundle"
23
24
  end
25
+
26
+ Rake::TestTask.new do |t|
27
+ t.libs << 'test'
28
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.3
1
+ 0.9.4
data/lib/monad/maybe.rb CHANGED
@@ -8,7 +8,7 @@ require_relative 'maybe/list'
8
8
  #
9
9
  module Enumerable
10
10
  def to_maybe
11
- first.maybe
11
+ first.to_maybe
12
12
  end
13
13
 
14
14
  def maybe_map
@@ -16,18 +16,7 @@ module Enumerable
16
16
  end
17
17
  end
18
18
 
19
- class Array; include Enumerable end
20
- class Range; include Enumerable end
21
-
22
19
  class Object
23
- def maybe(obj=self, &blk)
24
- if obj && blk
25
- blk.call(obj).to_maybe
26
- else
27
- obj.to_maybe
28
- end
29
- end
30
-
31
20
  def to_maybe
32
21
  Monad::Maybe::Just.new(self)
33
22
  end
@@ -43,24 +32,24 @@ class Object
43
32
  def nothing?
44
33
  false
45
34
  end
46
-
47
- def something?(&blk)
48
- true
49
- end
50
35
  end
51
36
 
52
37
  class NilClass
53
38
  def to_maybe
54
- Monad::Maybe::Nothing.instance.freeze
39
+ Monad::Maybe::Nothing.instance
55
40
  end
41
+ end
56
42
 
57
- def maybe(&blk)
58
- to_maybe
43
+ module Monad
44
+ module Maybe
45
+ def self.return(obj)
46
+ obj.to_maybe
47
+ end
59
48
  end
49
+ end
60
50
 
61
- def something?
62
- false
63
- end
51
+ def maybe(obj)
52
+ Monad::Maybe.return(obj)
64
53
  end
65
54
 
66
55
  def just(o)
@@ -18,6 +18,19 @@ module Monad
18
18
  def to_maybe
19
19
  self
20
20
  end
21
+
22
+ def maybe(&blk)
23
+ bind(blk)
24
+ end
25
+
26
+ def then(fn)
27
+ bind(->(x){ fn && fn.call })
28
+ self
29
+ end
30
+
31
+ def and(&blk)
32
+ self.then(blk)
33
+ end
21
34
 
22
35
  private
23
36
  def initialize; end
@@ -27,11 +27,11 @@ module Monad
27
27
 
28
28
  # NOTE: being able to return Nothings maybe dangerous
29
29
  def maybe(&blk)
30
- if blk
31
- blk.call(self.value).to_maybe
32
- else
33
- self
34
- end
30
+ bind(blk)
31
+ end
32
+
33
+ def bind(fn)
34
+ fn[@value].to_maybe
35
35
  end
36
36
 
37
37
  def nil?
@@ -4,7 +4,7 @@ module Monad
4
4
  include Enumerable
5
5
 
6
6
  def initialize(enum)
7
- @enum = enum.map { |v| v.maybe? ? v : v.maybe }
7
+ @enum = enum.map { |v| v.maybe? ? v : v.to_maybe }
8
8
  end
9
9
 
10
10
  def inspect
@@ -25,7 +25,7 @@ module Monad
25
25
  true
26
26
  end
27
27
 
28
- def maybe(&blk)
28
+ def bind(fn)
29
29
  self
30
30
  end
31
31
 
data/monad-maybe.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "monad-maybe"
8
- s.version = "0.9.3"
8
+ s.version = "0.9.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Delon Newman"]
data/test/maybe.rb CHANGED
@@ -4,16 +4,16 @@ require_relative '../lib/monad/maybe/json'
4
4
 
5
5
  class MaybeTest < Test::Unit::TestCase
6
6
  def test_nothing
7
- assert nil.maybe.nothing?
8
- assert nil.maybe.value.nil?
9
- assert_equal 'test', nil.maybe.unwrap('test')
7
+ assert nil.to_maybe.nothing?
8
+ assert nil.to_maybe.value.nil?
9
+ assert_equal 'test', nil.to_maybe.unwrap('test')
10
10
  assert_equal '', nothing.to_s
11
11
  end
12
12
 
13
13
  def test_just
14
- assert 1.maybe.just?
15
- assert_equal 1, 1.maybe.value
16
- assert_equal 1, 1.maybe.unwrap('test')
14
+ assert maybe(1).just?
15
+ assert_equal 1, 1.to_maybe.value
16
+ assert_equal 1, 1.to_maybe.unwrap('test')
17
17
  assert_equal '1', just(1).to_s
18
18
  end
19
19
 
@@ -26,25 +26,25 @@ class MaybeTest < Test::Unit::TestCase
26
26
  end
27
27
 
28
28
  def test_to_a
29
- assert_equal [1.maybe], 1.maybe.to_a
30
- assert_equal [], nil.maybe.to_a
29
+ assert_equal [1.to_maybe], 1.to_maybe.to_a
30
+ assert_equal [], nil.to_maybe.to_a
31
31
  end
32
32
 
33
33
  def test_false
34
- assert_equal false, false.maybe.value
34
+ assert_equal false, false.to_maybe.value
35
35
  end
36
36
 
37
37
  def test_nil_conversions
38
- assert_equal nil.nil?, nil.maybe.nil?
38
+ assert_equal nil.nil?, nil.to_maybe.nil?
39
39
  end
40
40
 
41
41
  def test_class
42
- assert_equal Monad::Maybe::Nothing, nil.maybe.class
43
- assert_equal Monad::Maybe::Just, 1.maybe.class
42
+ assert_equal Monad::Maybe::Nothing, maybe(nil).class
43
+ assert_equal Monad::Maybe::Just, maybe(1).class
44
44
  end
45
45
 
46
46
  def test_list
47
- xs = true.maybe << nil.maybe << 1.maybe << 3.maybe
47
+ xs = true.to_maybe << nil.to_maybe << 1.to_maybe << 3.to_maybe
48
48
  assert_equal 3, xs.count
49
49
  xs.each { |x| assert x.just? }
50
50
  end
@@ -58,12 +58,6 @@ class MaybeTest < Test::Unit::TestCase
58
58
  end
59
59
 
60
60
  def test_maybe_block
61
- assert_nothing_raised do
62
- nil.maybe do
63
- raise Exception, "This should not be called"
64
- end
65
- end
66
-
67
61
  assert_nothing_raised do
68
62
  nothing.maybe do
69
63
  raise Exception, "This should not be called"
@@ -76,10 +70,6 @@ class MaybeTest < Test::Unit::TestCase
76
70
  end
77
71
  end
78
72
 
79
- 1.maybe do |n|
80
- assert_equal 1, n
81
- end
82
-
83
73
  maybe(1) do |n|
84
74
  assert_equal 1, n
85
75
  end
@@ -90,25 +80,17 @@ class MaybeTest < Test::Unit::TestCase
90
80
  end
91
81
 
92
82
  def test_maybe_block_return_value_and_type
93
- m = 1.maybe { |n| n + 1 }
83
+ m = maybe(1).maybe { |n| n + 1 }
94
84
  assert_equal 2, m.value
95
85
  assert m.maybe?
96
86
  assert m.just?
97
87
 
98
- o = 2.maybe { nil }
88
+ o = maybe(2).maybe { nil }
99
89
  assert_equal nil, o.value
100
90
  assert o.maybe?
101
91
  assert o.nothing?
102
92
  end
103
93
 
104
- def test_something?
105
- assert_equal false, nil.something?
106
- assert_equal false, nothing.something?
107
- assert 1.something?
108
- assert 1.maybe.something?
109
- assert (0..10).maybe_map { |n| n }.something?
110
- end
111
-
112
94
  def test_to_maybe
113
95
  assert_equal just(1), 1.to_maybe
114
96
  assert_equal just(1), just(1).to_maybe
@@ -117,4 +99,51 @@ class MaybeTest < Test::Unit::TestCase
117
99
  assert_equal 1.to_maybe, [1].to_maybe
118
100
  assert_equal 0.to_maybe, (0..10).maybe_map { |n| n }.to_maybe
119
101
  end
102
+
103
+ def test_then_and_and
104
+ just(1).and do
105
+ assert true
106
+ end
107
+
108
+ nothing.and do
109
+ assert true
110
+ end
111
+
112
+ just(1).and{ assert true }.and{ assert true }
113
+ maybe(1).then(->(){ assert true }).then(->(){ assert true })
114
+ end
115
+
116
+ #
117
+ # Monad laws
118
+ #
119
+
120
+ #
121
+ # Right Unit:
122
+ # m >>= return = m
123
+ #
124
+ def test_right_unit
125
+ m = just(1)
126
+ assert_equal m, m.bind(->(x){ Monad::Maybe.return(x) })
127
+ end
128
+
129
+ #
130
+ # Left Unit:
131
+ # return x >>= f = f x
132
+ #
133
+ def test_left_unit
134
+ x = 2
135
+ f = ->(x) { x + 1 }
136
+ assert_equal Monad::Maybe.return(x).bind(f), f[x]
137
+ end
138
+
139
+ #
140
+ # Associativity:
141
+ # (m >>= f) >>= g = m >>= (\x -> f x >>= g)
142
+ #
143
+ def test_associativity
144
+ m = just(3.1459)
145
+ f = ->(x) { x ** 2 }
146
+ g = ->(x) { 2 * x }
147
+ assert_equal m.bind(f).bind(g), m.bind(->(x) { f[x] }).bind(g)
148
+ end
120
149
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: monad-maybe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 0.9.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Delon Newman