data.either 0.0.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 (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/either.rb +95 -0
  3. metadata +44 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: dab81e54473d3fc3faab4f7aeffa4bb51f2c70b3
4
+ data.tar.gz: 975af75a0be0c918e982c902d41cf24ef468668b
5
+ SHA512:
6
+ metadata.gz: 4cbdc22b3a748a6668fafaaf10746185ba9ca1e9ea0df7021d258379eb4ce43c8b0741e5a727103be589c8a298805327b8cc022c4c32e74b1c3e7ba79ca198c6
7
+ data.tar.gz: 943ee4bdb6277cc9382af4cef7c4affc5545e99c4c417f7d24a2b7a49f4e1e4de72d0d94a1bef313181286bd71178395c50231b88e2afbe0273bc514cbb9836a
data/lib/either.rb ADDED
@@ -0,0 +1,95 @@
1
+ # a very simple Either
2
+ module Either
3
+ def initialize v
4
+ @v = v
5
+ end
6
+
7
+ def get_or_else e
8
+ case self
9
+ when Right
10
+ @v
11
+ else
12
+ e
13
+ end
14
+ end
15
+
16
+ # Functor
17
+ def map
18
+ case self
19
+ when Right
20
+ Right.new(yield @v)
21
+ else
22
+ self
23
+ end
24
+ end
25
+
26
+ alias :fmap :map
27
+
28
+ def left_map
29
+ case self
30
+ when Left
31
+ Left.new(yield @v)
32
+ else
33
+ self
34
+ end
35
+ end
36
+
37
+ def bimap lfn, rfn
38
+ case self
39
+ when Right
40
+ Right.new(rfn.(@v))
41
+ else
42
+ Left.new(lfn.(@v))
43
+ end
44
+ end
45
+
46
+ # Monad
47
+ def bind
48
+ case self
49
+ when Right
50
+ yield @v
51
+ else
52
+ self
53
+ end
54
+ end
55
+
56
+ alias :chain :bind
57
+ alias :flat_map :bind
58
+
59
+ def inspect
60
+ case self
61
+ when Left
62
+ "#<Left value=#{@v}>"
63
+ else
64
+ "#<Right value=#{@v}>"
65
+ end
66
+ end
67
+ end
68
+
69
+ class Left
70
+ include Either
71
+ def initialize v=nil
72
+ @v=v
73
+ end
74
+
75
+ def == other
76
+ case other
77
+ when Left
78
+ other.left_map { |v| return v == @v }
79
+ else
80
+ false
81
+ end
82
+ end
83
+ end
84
+
85
+ class Right
86
+ include Either
87
+ def == other
88
+ case other
89
+ when Right
90
+ other.map { |v| return v == @v }
91
+ else
92
+ false
93
+ end
94
+ end
95
+ end
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: data.either
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jichao Ouyang
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-08-18 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: The Either Monad
14
+ email: oyanglulu@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/either.rb
20
+ homepage: https://github.com/jcouyang/cats.rb
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.4.5
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: Either Data Type for Ruby
44
+ test_files: []