mangrove 0.35.0 → 0.36.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 +4 -0
- data/README.md +0 -1
- data/lib/mangrove/try_from_ext.rb +41 -0
- data/lib/mangrove/version.rb +1 -1
- data/lib/mangrove.rb +1 -0
- data/lib/tapioca/dsl/compilers/mangrove_try_from_ext.rb +33 -0
- data/sorbet/rbi/dsl/.gitattributes +1 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 371d0e77c422e441bc8798ca1aacf77cf11126fcea3bec2aba243c1a4970300f
|
4
|
+
data.tar.gz: 1cc24f3c80fe6c2fdca11c75193df51f7d77be047ecb40f98700b30a6eb5df4a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2aa303b678e5a045c0f1b13acd24cbbed698ea69e278b94fb7df2015924f5627cc86841c5769e30434ca613fef2adf489c6b555875dafff8733b593358321ea1
|
7
|
+
data.tar.gz: 62c17b4a366a86ec193b09196af476e58f921edebf1118ac875af70e6a61ca5eaa58e5a764f28f82372a266149be5b02a0af3276e2c8857e1d0699019366073a
|
data/.rubocop.yml
CHANGED
@@ -31,6 +31,9 @@ Metrics/ModuleLength:
|
|
31
31
|
Naming/BlockForwarding:
|
32
32
|
EnforcedStyle: explicit
|
33
33
|
|
34
|
+
Naming/MethodParameterName:
|
35
|
+
Enabled: false
|
36
|
+
|
34
37
|
Naming/VariableNumber:
|
35
38
|
EnforcedStyle: snake_case
|
36
39
|
|
@@ -64,3 +67,4 @@ Style/StringLiterals:
|
|
64
67
|
Style/StringLiteralsInInterpolation:
|
65
68
|
Enabled: true
|
66
69
|
EnforcedStyle: double_quotes
|
70
|
+
|
data/README.md
CHANGED
@@ -17,7 +17,6 @@ Mangrove is a Ruby toolkit that brings a functional, statically-typed flavor to
|
|
17
17
|
|
18
18
|
- **Enums (ADTs)**
|
19
19
|
Define your own sealed enums with typed variants. Each variant can hold distinct inner data.
|
20
|
-
|
21
20
|
- **Functional Patterns**
|
22
21
|
Chain transformations or short-circuit error handling with a clean monadic style.
|
23
22
|
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# typed: true
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Mangrove
|
5
|
+
module TryFromExt
|
6
|
+
extend T::Sig
|
7
|
+
extend T::Helpers
|
8
|
+
|
9
|
+
include Kernel
|
10
|
+
|
11
|
+
sig {
|
12
|
+
type_parameters(:I, :O, :E)
|
13
|
+
.params(
|
14
|
+
from: T::Class[T.type_parameter(:I)],
|
15
|
+
to: T::Class[T.type_parameter(:O)],
|
16
|
+
err: T::Class[T.type_parameter(:E)],
|
17
|
+
block: T.proc.params(arg: T.type_parameter(:I)).returns(Mangrove::Result[T.type_parameter(:O), T.type_parameter(:E)])
|
18
|
+
).void
|
19
|
+
}
|
20
|
+
# rubocop:disable Lint/UnusedMethodArgument
|
21
|
+
def try_convert_from(from:, to:, err:, &block)
|
22
|
+
T.bind(self, T::Class[T.type_parameter(:O)])
|
23
|
+
|
24
|
+
vars = from.instance_variable_get(:@convertable_to) || {}
|
25
|
+
vars[self] = block
|
26
|
+
from.instance_variable_set(:@convertable_to, vars)
|
27
|
+
|
28
|
+
@convertable_from ||= {}
|
29
|
+
@convertable_from[from] = [err, block]
|
30
|
+
|
31
|
+
into_t = T.cast(self, Class)
|
32
|
+
|
33
|
+
from.define_method("try_into_#{T.must_because(into_t.name) { "name is required" }.gsub(/::|([A-Z]+)([A-Z][a-z])/, '\1_\2').gsub(/([a-z\d])([A-Z])/, '\1_\2').downcase}") do
|
34
|
+
proc = T.unsafe(self).class.ancestors.lazy.map { |klass| klass.instance_variable_get(:@convertable_to)&.[](into_t) }.find(&:itself)
|
35
|
+
|
36
|
+
proc.call(self)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
# rubocop:enable Lint/UnusedMethodArgument
|
40
|
+
end
|
41
|
+
end
|
data/lib/mangrove/version.rb
CHANGED
data/lib/mangrove.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
# typed: true
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "mangrove/try_from_ext"
|
5
|
+
require "tapioca/dsl"
|
6
|
+
require "sorbet-runtime"
|
7
|
+
|
8
|
+
module Tapioca
|
9
|
+
module Compilers
|
10
|
+
class TryFromExt < Tapioca::Dsl::Compiler
|
11
|
+
extend T::Sig
|
12
|
+
|
13
|
+
ConstantType = type_member { { fixed: T.class_of(Mangrove::TryFromExt) } }
|
14
|
+
|
15
|
+
sig { override.returns(T::Enumerable[Module]) }
|
16
|
+
def self.gather_constants
|
17
|
+
all_classes.select { |c| c.singleton_class < ::Mangrove::TryFromExt }
|
18
|
+
end
|
19
|
+
|
20
|
+
sig { override.void }
|
21
|
+
def decorate
|
22
|
+
return if constant.instance_variable_get(:@convertable_from).nil? || constant.instance_variable_get(:@convertable_from).empty?
|
23
|
+
|
24
|
+
constant.instance_variable_get(:@convertable_from)&.each do |convertable_from, values|
|
25
|
+
err_constant, _block = values
|
26
|
+
root.create_path(convertable_from) do |klass|
|
27
|
+
klass.create_method("try_into_#{constant.to_s.gsub(/::|([A-Z]+)([A-Z][a-z])/, '\1_\2').gsub(/([a-z\d])([A-Z])/, '\1_\2').downcase}", return_type: "Mangrove::Result[#{constant}, #{err_constant}]")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
**/*.rbi linguist-generated=true
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mangrove
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.36.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kazuma Murata
|
8
8
|
bindir: exe
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-
|
10
|
+
date: 2025-03-28 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: sorbet-runtime
|
@@ -47,14 +47,17 @@ files:
|
|
47
47
|
- lib/mangrove/result.rb
|
48
48
|
- lib/mangrove/result/control_signal.rb
|
49
49
|
- lib/mangrove/result/ext.rb
|
50
|
+
- lib/mangrove/try_from_ext.rb
|
50
51
|
- lib/mangrove/version.rb
|
51
52
|
- lib/tapioca/dsl/compilers/mangrove_enum.rb
|
52
53
|
- lib/tapioca/dsl/compilers/mangrove_result_ext.rb
|
54
|
+
- lib/tapioca/dsl/compilers/mangrove_try_from_ext.rb
|
53
55
|
- rbi/mangrove.rbi
|
54
56
|
- sig/mangrove.rbs
|
55
57
|
- sorbet/config
|
56
58
|
- sorbet/rbi/annotations/.gitattributes
|
57
59
|
- sorbet/rbi/annotations/rainbow.rbi
|
60
|
+
- sorbet/rbi/dsl/.gitattributes
|
58
61
|
- sorbet/rbi/gems/.gitattributes
|
59
62
|
- sorbet/rbi/gems/ast@2.4.2.rbi
|
60
63
|
- sorbet/rbi/gems/benchmark@0.4.0.rbi
|