data.maybe 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.
- checksums.yaml +7 -0
- data/lib/control/monad.rb +25 -0
- data/lib/data.maybe.rb +118 -0
- data/lib/helper.rb +9 -0
- metadata +46 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8806e85d0ca8b9733e9bf574476aabf3eb61bba5
|
4
|
+
data.tar.gz: a0df6bfe5d96121adb1112b7db2ec0181e4f58ef
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 03c0be25899d188fc7ac9e18332094e07fe40c77970572d536ba7ddb113d01c560afb5f6661dae47ecea83afde65a571414e727bbd89c9f12b718af391f6a221
|
7
|
+
data.tar.gz: 536c7efbbf71487e5b189fc851df60d26bb78108100ca950335c616e027815f8ff48170c143ce5e8a044be4be5636e5ee79b3cab1f273eb9397578435c0242be
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'helper'
|
2
|
+
module Control
|
3
|
+
module Functor
|
4
|
+
extend Helper
|
5
|
+
def map
|
6
|
+
raise 'map No defined'
|
7
|
+
end
|
8
|
+
alias_names [:fmap], :map
|
9
|
+
end
|
10
|
+
|
11
|
+
module Monad
|
12
|
+
extend Helper
|
13
|
+
include Functor
|
14
|
+
def flat_map
|
15
|
+
raise 'flat_map No defined'
|
16
|
+
end
|
17
|
+
alias :fmap :map
|
18
|
+
alias_names [:bind, :chain], :flat_map
|
19
|
+
|
20
|
+
def >> k
|
21
|
+
self.flat_map { |_| k }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
data/lib/data.maybe.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'control/monad'
|
2
|
+
require 'singleton'
|
3
|
+
# The `Either` union type represents values with two possibilities:
|
4
|
+
#
|
5
|
+
# `Either a b` is either `Left a` or `Right b`
|
6
|
+
module Maybe
|
7
|
+
include Control::Monad
|
8
|
+
|
9
|
+
# Either only contain one value @v
|
10
|
+
# @return [Either]
|
11
|
+
def initialize v=nil
|
12
|
+
@v = v
|
13
|
+
end
|
14
|
+
|
15
|
+
# get value `a` out from `Right a`, otherwise return `e`
|
16
|
+
def get_or_else e
|
17
|
+
case self
|
18
|
+
when Just
|
19
|
+
@v
|
20
|
+
else
|
21
|
+
e
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# overide of Functor's `fmap`, apply function on `Right a`'s value `a`, do nothing if it's `Left e`
|
26
|
+
#
|
27
|
+
# ``` ruby
|
28
|
+
# Right.new(1).map {|x| x + 1} # => #<Right value=2>
|
29
|
+
# Left.new(1).map {|x| x + 1} # => #<Left value=1>
|
30
|
+
# ```
|
31
|
+
# @return [Either]
|
32
|
+
def map
|
33
|
+
case self
|
34
|
+
when Just
|
35
|
+
Just.new(yield @v)
|
36
|
+
else
|
37
|
+
self
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# it override {Monad#flat_map}, as Haskell's `>flat_map` method
|
42
|
+
# if it's {Right}, pass the value to #flat_map's block, and flat the result
|
43
|
+
# of the block.
|
44
|
+
#
|
45
|
+
# when it's {Left}, do nothing
|
46
|
+
# ``` ruby
|
47
|
+
# expect(Right.new(1).flat_map { |x| Left.new } ).to eq(Left.new)
|
48
|
+
# expect(Left.new(1).flat_map { |x| Left.new } ).to eq(Left.new(1))
|
49
|
+
# ```
|
50
|
+
# @return [Either]
|
51
|
+
def flat_map
|
52
|
+
case self
|
53
|
+
when Just
|
54
|
+
yield @v
|
55
|
+
else
|
56
|
+
self
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# similar to Scala's `match` for case class
|
61
|
+
#
|
62
|
+
# will pattern match the value out and pass to matched lambda
|
63
|
+
#
|
64
|
+
# ``` ruby
|
65
|
+
# Right.new(1).when({Right: ->x{x+1} }) # => 2
|
66
|
+
# Right.new(1).when({Left: ->x{x+1}) # => nil
|
67
|
+
# Right.new(1).when({Left: ->x{x+1}, _: ->x{x-1} }) # => 0
|
68
|
+
# ```
|
69
|
+
# @return [Either]
|
70
|
+
def when what
|
71
|
+
current_class = self.class.to_s.to_sym
|
72
|
+
if what.include? current_class
|
73
|
+
what[current_class].(@v)
|
74
|
+
elsif what.include? :_
|
75
|
+
what[:_].(@v)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# @return [String]
|
80
|
+
def inspect
|
81
|
+
case self
|
82
|
+
when Just
|
83
|
+
"#<Just #{@v}>"
|
84
|
+
else
|
85
|
+
"#<Nothing>"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
class Nothing
|
92
|
+
include Singleton
|
93
|
+
include Maybe
|
94
|
+
|
95
|
+
def == other
|
96
|
+
case other
|
97
|
+
when Nothing
|
98
|
+
true
|
99
|
+
else
|
100
|
+
false
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
Nothing = Nothing.instance
|
106
|
+
|
107
|
+
class Just
|
108
|
+
include Maybe
|
109
|
+
|
110
|
+
def == other
|
111
|
+
case other
|
112
|
+
when Just
|
113
|
+
other.map { |v| return v == @v }
|
114
|
+
else
|
115
|
+
false
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
data/lib/helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: data.maybe
|
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-26 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: lightweight data.maybe Monad
|
14
|
+
email: oyanglulu@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/control/monad.rb
|
20
|
+
- lib/data.maybe.rb
|
21
|
+
- lib/helper.rb
|
22
|
+
homepage: https://github.com/jcouyang/cats.rb
|
23
|
+
licenses:
|
24
|
+
- MIT
|
25
|
+
metadata: {}
|
26
|
+
post_install_message:
|
27
|
+
rdoc_options: []
|
28
|
+
require_paths:
|
29
|
+
- lib
|
30
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 1.9.3
|
35
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
requirements: []
|
41
|
+
rubyforge_project:
|
42
|
+
rubygems_version: 2.4.5
|
43
|
+
signing_key:
|
44
|
+
specification_version: 4
|
45
|
+
summary: data.maybe Data Type for Ruby
|
46
|
+
test_files: []
|