monad-maybe 0.9.3 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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