mangrove 0.2.0 → 0.4.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 +4 -4
- data/.rubocop.yml +10 -0
- data/README.md +52 -12
- data/Rakefile +2 -2
- data/lib/mangrove/control_flow/rewriter.rb +5 -2
- data/lib/mangrove/result.rb +12 -17
- data/lib/mangrove/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 06e20e8a9945c52ddba260f01fa12a7f8e65fda55fe2a369f85eb296b428eeb7
|
|
4
|
+
data.tar.gz: 524eba3f2d942063c597568e7d432f18cff9f6e5b85efc5eeadb3d055eaaac46
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 88cbb663b866dfd8fb559adc76b847a8501e1d96c237e0ef919c339381f142f4ce7a91482770bd239e2f68588793171c900e9b87a57f50f0c290d9982f944b2c
|
|
7
|
+
data.tar.gz: 9c1b5d530382de4eeeeb2cf20e0a18abd184a0dbd10cbf66fef190f1d897026863449afa56fa0de4d34cb594659d00a93e5eab2ae6ec548050dbcb3ce20321d2
|
data/.rubocop.yml
CHANGED
|
@@ -9,6 +9,9 @@ Layout/FirstArrayElementIndentation:
|
|
|
9
9
|
Layout/LineLength:
|
|
10
10
|
Enabled: false
|
|
11
11
|
|
|
12
|
+
Layout/MultilineMethodCallIndentation:
|
|
13
|
+
EnforcedStyle: indented
|
|
14
|
+
|
|
12
15
|
Metrics/AbcSize:
|
|
13
16
|
Enabled: false
|
|
14
17
|
|
|
@@ -27,6 +30,13 @@ Metrics/ModuleLength:
|
|
|
27
30
|
Naming/VariableNumber:
|
|
28
31
|
EnforcedStyle: snake_case
|
|
29
32
|
|
|
33
|
+
Style/BlockDelimiters:
|
|
34
|
+
EnforcedStyle: always_braces
|
|
35
|
+
AllowedMethods:
|
|
36
|
+
- describe
|
|
37
|
+
- context
|
|
38
|
+
- it
|
|
39
|
+
|
|
30
40
|
Style/Documentation:
|
|
31
41
|
Enabled: false
|
|
32
42
|
|
data/README.md
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# Mangrove
|
|
2
|
-
Mangrove provides utility
|
|
2
|
+
Mangrove provides type utility to use with Sorbet.
|
|
3
|
+
|
|
4
|
+
You can do something like this with the gem.
|
|
5
|
+
|
|
6
|
+
```ruby
|
|
7
|
+
class MyClass
|
|
8
|
+
extend T::Sig
|
|
9
|
+
|
|
10
|
+
include Mangrove::ControlFlow::Handler
|
|
11
|
+
|
|
12
|
+
sig { params(numbers: T::Enumerable[Integer]).returns(Mangrove::Result[T::Array[Integer], String]) }
|
|
13
|
+
def divide_arguments_by_3(numbers)
|
|
14
|
+
divided_nubmers = numbers
|
|
15
|
+
.map { |number|
|
|
16
|
+
if number % 3 == 0
|
|
17
|
+
Mangrove::Result::Ok.new(number / 3)
|
|
18
|
+
else
|
|
19
|
+
Mangrove::Result::Err.new("number #{number} is not divisible by 3")
|
|
20
|
+
end
|
|
21
|
+
}
|
|
22
|
+
.map(&:unwrap!)
|
|
23
|
+
|
|
24
|
+
Mangrove::Result::Ok.new(divided_nubmers)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
expect(MyClass.new.divide_arguments_by_3([3, 4, 6])).to eq Mangrove::Result::Err.new("number 4 is not divisible by 3")
|
|
29
|
+
expect(MyClass.new.divide_arguments_by_3([3, 6, 9])).to eq Mangrove::Result::Ok.new([1, 2, 3])
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Other examples are available at `spec/**/**_spec.rb`.
|
|
3
33
|
|
|
4
34
|
## Features
|
|
5
35
|
Most features are not implemented.
|
|
@@ -10,24 +40,34 @@ Most features are not implemented.
|
|
|
10
40
|
- [x] Auto propagation like Rust's `?` (formerly `try!`)
|
|
11
41
|
- [ ] Builder type (Not implemented)
|
|
12
42
|
- [ ] Auto Implementation
|
|
13
|
-
|
|
14
|
-
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/mangrove`. To experiment with that code, run `bin/console` for an interactive prompt.
|
|
43
|
+
- [ ] TODO
|
|
15
44
|
|
|
16
45
|
## Installation
|
|
17
46
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
47
|
+
```
|
|
48
|
+
bundle add mangrove
|
|
49
|
+
```
|
|
21
50
|
|
|
22
|
-
|
|
51
|
+
## Usage
|
|
23
52
|
|
|
24
|
-
|
|
53
|
+
see `spec/**/**_spec.rb`.
|
|
25
54
|
|
|
26
|
-
|
|
55
|
+
```ruby
|
|
56
|
+
Mangrove::Result[OkType, ErrType]
|
|
57
|
+
Mangrove::Result::Ok[OkType, ErrType]
|
|
58
|
+
Mangrove::Result::Err[OkType, ErrType]
|
|
59
|
+
Mangrove::Option[InnerType]
|
|
60
|
+
Mangrove::Option::Some[InnerType]
|
|
61
|
+
Mangrove::Option::None[InnerType]
|
|
27
62
|
|
|
28
|
-
|
|
63
|
+
my_ok = Result::Ok.new("my value")
|
|
64
|
+
my_err = Result::Err.new("my err")
|
|
65
|
+
my_some = Option::Some.new(1234)
|
|
66
|
+
my_none = Option::None.new
|
|
29
67
|
|
|
30
|
-
|
|
68
|
+
# Including this Module into your class appends rescue clause into its methods. Results to `Option#unwrap!` and `Result#unwrap!` propagates to calling method like Ruet's `?` operator.
|
|
69
|
+
include Mangrove::ControlFlow::Handler
|
|
70
|
+
```
|
|
31
71
|
|
|
32
72
|
## Commands
|
|
33
73
|
```
|
|
@@ -53,4 +93,4 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
|
53
93
|
|
|
54
94
|
## Contributing
|
|
55
95
|
|
|
56
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
|
96
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/kazzix14/mangrove.
|
data/Rakefile
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
require "bundler/gem_tasks"
|
|
4
4
|
require "rake/testtask"
|
|
5
5
|
|
|
6
|
-
task
|
|
6
|
+
task(:check) {
|
|
7
7
|
system("bundle exec ordinare --check") &&
|
|
8
8
|
system("bundle exec rubocop -DESP") &&
|
|
9
9
|
system("bundle exec tapioca check-shims") &&
|
|
10
10
|
system("bundle exec srb typecheck") &&
|
|
11
11
|
system("bundle exec rspec -f d")
|
|
12
|
-
|
|
12
|
+
}
|
|
13
13
|
|
|
14
14
|
task default: :check
|
|
@@ -127,7 +127,7 @@ module Mangrove
|
|
|
127
127
|
end
|
|
128
128
|
|
|
129
129
|
def rescue_body_node
|
|
130
|
-
control_flow =
|
|
130
|
+
control_flow = Mangrove::ControlFlow::ControlSignal
|
|
131
131
|
|
|
132
132
|
::Parser::AST::Node.new(:resbody, [
|
|
133
133
|
::Parser::AST::Node.new(:array, [
|
|
@@ -143,7 +143,10 @@ module Mangrove
|
|
|
143
143
|
:Err
|
|
144
144
|
]),
|
|
145
145
|
:new,
|
|
146
|
-
::Parser::AST::Node.new(:
|
|
146
|
+
::Parser::AST::Node.new(:send, [
|
|
147
|
+
::Parser::AST::Node.new(:lvar, [:exception]),
|
|
148
|
+
:inner_value
|
|
149
|
+
])
|
|
147
150
|
])
|
|
148
151
|
])
|
|
149
152
|
end
|
data/lib/mangrove/result.rb
CHANGED
|
@@ -47,7 +47,7 @@ module Mangrove
|
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
sig { returns(OkType) }
|
|
50
|
-
def
|
|
50
|
+
def ok_inner
|
|
51
51
|
@inner
|
|
52
52
|
end
|
|
53
53
|
|
|
@@ -106,14 +106,19 @@ module Mangrove
|
|
|
106
106
|
end
|
|
107
107
|
end
|
|
108
108
|
|
|
109
|
+
sig { returns(ErrType) }
|
|
110
|
+
def err_inner
|
|
111
|
+
@inner
|
|
112
|
+
end
|
|
113
|
+
|
|
109
114
|
sig { override.returns(OkType) }
|
|
110
115
|
def unwrap!
|
|
111
|
-
raise Result::ControlSignal,
|
|
116
|
+
raise Result::ControlSignal, @inner
|
|
112
117
|
end
|
|
113
118
|
|
|
114
119
|
sig { override.params(message: String).returns(OkType) }
|
|
115
120
|
def expect!(message)
|
|
116
|
-
raise Result::ControlSignal,
|
|
121
|
+
raise Result::ControlSignal, message
|
|
117
122
|
end
|
|
118
123
|
|
|
119
124
|
sig { override.returns(T::Boolean) }
|
|
@@ -122,16 +127,12 @@ module Mangrove
|
|
|
122
127
|
sig { override.returns(T::Boolean) }
|
|
123
128
|
def err? = true
|
|
124
129
|
|
|
125
|
-
sig
|
|
126
|
-
override.params(_block: T.proc.params(this: OkType).returns(Result[OkType, ErrType])).returns(Result[OkType, ErrType])
|
|
127
|
-
end
|
|
130
|
+
sig { override.params(_block: T.proc.params(this: OkType).returns(Result[OkType, ErrType])).returns(Result[OkType, ErrType]) }
|
|
128
131
|
def map_ok(&_block)
|
|
129
132
|
self
|
|
130
133
|
end
|
|
131
134
|
|
|
132
|
-
sig
|
|
133
|
-
override.params(block: T.proc.params(this: ErrType).returns(Result[OkType, ErrType])).returns(Result[OkType, ErrType])
|
|
134
|
-
end
|
|
135
|
+
sig { override.params(block: T.proc.params(this: ErrType).returns(Result[OkType, ErrType])).returns(Result[OkType, ErrType]) }
|
|
135
136
|
def map_err(&block)
|
|
136
137
|
block.call(@inner)
|
|
137
138
|
end
|
|
@@ -152,16 +153,10 @@ module Mangrove
|
|
|
152
153
|
sig { abstract.params(message: String).returns(OkType) }
|
|
153
154
|
def expect!(message); end
|
|
154
155
|
|
|
155
|
-
sig
|
|
156
|
-
abstract.params(block: T.proc.params(this: OkType).returns(Result[OkType,
|
|
157
|
-
ErrType])).returns(Result[OkType, ErrType])
|
|
158
|
-
end
|
|
156
|
+
sig { abstract.params(block: T.proc.params(this: OkType).returns(Result[OkType, ErrType])).returns(Result[OkType, ErrType]) }
|
|
159
157
|
def map_ok(&block); end
|
|
160
158
|
|
|
161
|
-
sig
|
|
162
|
-
abstract.params(block: T.proc.params(this: ErrType).returns(Result[OkType,
|
|
163
|
-
ErrType])).returns(Result[OkType, ErrType])
|
|
164
|
-
end
|
|
159
|
+
sig { abstract.params(block: T.proc.params(this: ErrType).returns(Result[OkType, ErrType])).returns(Result[OkType, ErrType]) }
|
|
165
160
|
def map_err(&block); end
|
|
166
161
|
end
|
|
167
162
|
end
|
data/lib/mangrove/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mangrove
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Kazuma Murata
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-08-
|
|
11
|
+
date: 2023-08-30 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: sorbet-runtime
|