indubitably 0.3.0

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.
Files changed (2) hide show
  1. data/lib/indubitably.rb +129 -0
  2. metadata +48 -0
@@ -0,0 +1,129 @@
1
+ class Maybe
2
+ ([:each] + Enumerable.instance_methods).each do |enumerable_method|
3
+ define_method(enumerable_method) do |*args, &block|
4
+ res = __enumerable_value.send(enumerable_method, *args, &block)
5
+ res.respond_to?(:each) ? Maybe(res.first) : res
6
+ end
7
+ end
8
+
9
+ def to_ary
10
+ __enumerable_value
11
+ end
12
+ alias_method :to_a, :to_ary
13
+
14
+ def ==(other)
15
+ other.class == self.class
16
+ end
17
+ alias_method :eql?, :==
18
+
19
+ def self.empty_value?(value)
20
+ value.nil? || (value.respond_to?(:length) && value.length == 0)
21
+ end
22
+ end
23
+
24
+ # Represents a non-empty value
25
+ class Some < Maybe
26
+ def initialize(value)
27
+ @value = value
28
+ end
29
+
30
+ def get
31
+ @value
32
+ end
33
+
34
+ def or_else(*)
35
+ @value
36
+ end
37
+
38
+ # rubocop:disable PredicateName
39
+ def is_some?
40
+ true
41
+ end
42
+
43
+ def is_none?
44
+ false
45
+ end
46
+ # rubocop:enable PredicateName
47
+
48
+ def join
49
+ @value.is_a?(Maybe) ? @value : self
50
+ end
51
+
52
+ def join!
53
+ if @value.is_a?(Some)
54
+ @value.join!
55
+ elsif @value.is_a?(None)
56
+ @value
57
+ else
58
+ self
59
+ end
60
+ end
61
+
62
+ def ==(other)
63
+ super && get == other.get
64
+ end
65
+ alias_method :eql?, :==
66
+
67
+ def ===(other)
68
+ other && other.class == self.class && @value === other.get
69
+ end
70
+
71
+ def method_missing(method_sym, *args, &block)
72
+ if method_sym[0] == '_'
73
+ method_sym = method_sym.slice(1, method_sym.length)
74
+ end
75
+
76
+ map { |value| value.send(method_sym, *args, &block) }
77
+ end
78
+
79
+ private
80
+
81
+ def __enumerable_value
82
+ [@value]
83
+ end
84
+ end
85
+
86
+ # Represents an empty value
87
+ class None < Maybe
88
+ def get
89
+ fail 'No such element'
90
+ end
91
+
92
+ def or_else(els = nil)
93
+ block_given? ? yield : els
94
+ end
95
+
96
+ # rubocop:disable PredicateName
97
+ def is_some?
98
+ false
99
+ end
100
+
101
+ def is_none?
102
+ true
103
+ end
104
+ # rubocop:enable PredicateName
105
+
106
+ def method_missing(*)
107
+ self
108
+ end
109
+
110
+ private
111
+
112
+ def __enumerable_value
113
+ []
114
+ end
115
+ end
116
+
117
+ # rubocop:disable MethodName
118
+ def Maybe(value)
119
+ Maybe.empty_value?(value) ? None() : Some.new(value)
120
+ end
121
+
122
+ def Some(value)
123
+ Maybe(value)
124
+ end
125
+
126
+ def None
127
+ None.new
128
+ end
129
+ # rubocop:enable MethodName
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: indubitably
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Blake Hyde
9
+ - Mikko Koski
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2015-01-30 00:00:00.000000000 Z
14
+ dependencies: []
15
+ description: Maybe monad implementation for Ruby (some might call it Option pattern
16
+ or Null pattern)
17
+ email: syrion@gmail.com
18
+ executables: []
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - lib/indubitably.rb
23
+ homepage: https://github.com/asthasr/ruby-indubitably
24
+ licenses:
25
+ - MIT
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 1.8.23
45
+ signing_key:
46
+ specification_version: 3
47
+ summary: Maybe monad
48
+ test_files: []