possibly 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/possibly.rb +45 -0
  3. metadata +44 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: faca4e0b3b12f2fc14f83b8c58e3018932212630
4
+ data.tar.gz: 58fa77ff99cd6d0421c6e2366d896953c3c403b3
5
+ SHA512:
6
+ metadata.gz: 5fe55dbf369cd712de16b3c26f02f99d0c244e5e96b60b15124f2239afeb75d0607636c508a9b07f675d8562b4bc5ae849e63a754424c9243170a91d8638730e
7
+ data.tar.gz: f8e8fbb033038790674cd08b4b5b51b33aecb4be5e402839e50e856a21293e5169de7a5aa670f717699828eccf185fbc34b1af12b0948e012d779e421ce8cf62
data/lib/possibly.rb ADDED
@@ -0,0 +1,45 @@
1
+ module Maybe
2
+ class Maybe
3
+ ([:each] + Enumerable.instance_methods).each do |enumerable_method|
4
+ define_method(enumerable_method) { |*args, &block|
5
+ res = __enumerable_value.send(enumerable_method, *args, &block)
6
+ if res.respond_to?(:each) then Maybe(res.first) else res end
7
+ }
8
+ end
9
+ end
10
+
11
+ class Some < Maybe
12
+ def get() @value; end
13
+ def or_else(els) @value; end
14
+ def some?() true; end
15
+ def none?() false; end
16
+ def initialize(value) @value = value; end
17
+ def method_missing(method_sym, *args, &block)
18
+ map { |value| value.send(method_sym, *args, &block) }
19
+ end
20
+
21
+ private
22
+ def __enumerable_value() [@value]; end
23
+ end
24
+
25
+ class None < Maybe
26
+ def get() raise "No such element"; end
27
+ def or_else(els=nil) block_given? ? yield : els; end
28
+ def some?() false; end
29
+ def none?() true; end
30
+ def method_missing(method_sym, *args, &block)
31
+ None.new
32
+ end
33
+
34
+ private
35
+ def __enumerable_value() []; end
36
+ end
37
+ end
38
+
39
+ def Maybe(value)
40
+ if value == nil || (value.respond_to?(:length) && value.length == 0)
41
+ Maybe::None.new()
42
+ else
43
+ Maybe::Some.new(value)
44
+ end
45
+ end
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: possibly
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Mikko Koski
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-25 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email: mikko.koski@iki.fi
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/possibly.rb
20
+ homepage:
21
+ licenses:
22
+ - MIT
23
+ metadata: {}
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ required_ruby_version: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ required_rubygems_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ requirements: []
39
+ rubyforge_project:
40
+ rubygems_version: 2.2.2
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: Maybe monad
44
+ test_files: []