morpher 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cc9380b32ac09b2e3765666a2c56baeb3aef272d22be1f7043f1977c9da1d815
4
- data.tar.gz: 0736e2646b93e59dc8fb2bf992bdf7729431260a08f3b158dd1eaf1324a657f1
3
+ metadata.gz: 8f68237f24a5ee7b113c26e9f21c4a7765568b18ba0262dc86a7db3f437205ac
4
+ data.tar.gz: e861789e9b539d77aecbf81b12add653f5ac4f679c55ad9bed37ca4ccb50bc51
5
5
  SHA512:
6
- metadata.gz: 496748be0cfeae869808cb58aead93df98b270020b93310bba695ce03bea0cbc14b7451a881ce3b3e9280acbbf2155caaba7bfba827896bd79dd1119d9fa7fc0
7
- data.tar.gz: 0fc7f421fb376af18c2f1ea41eebf2b44350236e453a38878b1f015cb7cb15794d9e897de66c27c00143e1ce44b9271cc3f69be1ae79cb76f61f68a887e1c305
6
+ metadata.gz: f3adaf243ef357354e7f2b76e80ae4cfdf65f7913d13a0aa6f125656466da971758f03a71632ed5c944be289195d776b0addbc636277beb75a7312b7bfae45b9
7
+ data.tar.gz: aa3411aaf134378b122051c8365d54f08ad5db213fec95d7ff886c10e04ef5656fa2926c298938139b7fe8537f488eaeafafe5ec998e60e95c0cd0aad14a2e31
data/lib/morpher.rb CHANGED
@@ -8,6 +8,8 @@ require 'mprelude'
8
8
 
9
9
  module Morpher
10
10
  Either = MPrelude::Either
11
+
12
+ EMPTY_HASH = {}.freeze
11
13
  end
12
14
 
13
15
  require 'morpher/newtype'
@@ -3,8 +3,17 @@
3
3
  module Morpher
4
4
  # Generator for struct a-like wrappers
5
5
  class Record < Module
6
+ DEFAULTS = {
7
+ required: EMPTY_HASH,
8
+ optional: EMPTY_HASH
9
+ }.freeze
10
+
6
11
  include Anima.new(:required, :optional)
7
12
 
13
+ def self.new(**attributes)
14
+ super(DEFAULTS.merge(attributes))
15
+ end
16
+
8
17
  # rubocop:disable Metrics/AbcSize
9
18
  # rubocop:disable Metrics/MethodLength
10
19
  def included(host)
@@ -20,6 +20,29 @@ module Morpher
20
20
  # @return [Either<Error, Object>]
21
21
  abstract_method :call
22
22
 
23
+ # Build sequence
24
+ #
25
+ # @param [Transform] transform
26
+ #
27
+ # @return [Transform]
28
+ def seq(transform)
29
+ Sequence.new([self, transform])
30
+ end
31
+
32
+ # Build array transform
33
+ #
34
+ # @return [Transform]
35
+ def array
36
+ Array.new(self)
37
+ end
38
+
39
+ # Build maybe transform
40
+ #
41
+ # @return [Transform]
42
+ def maybe
43
+ Maybe.new(self)
44
+ end
45
+
23
46
  # Deep error data structure
24
47
  class Error
25
48
  include Anima.new(
@@ -59,13 +82,13 @@ module Morpher
59
82
 
60
83
  # Wrapper adding a name to a transformation
61
84
  class Named < self
62
- include Concord.new(:name, :transformer)
85
+ include Concord.new(:name, :transform)
63
86
 
64
87
  # Apply transformation to input
65
88
  #
66
89
  # @return [Either<Error, Object>]
67
90
  def call(input)
68
- transformer.call(input).lmap(&method(:wrap_error))
91
+ transform.call(input).lmap(&method(:wrap_error))
69
92
  end
70
93
 
71
94
  # Named slug
@@ -419,6 +442,15 @@ module Morpher
419
442
  class Sequence < self
420
443
  include Concord.new(:steps)
421
444
 
445
+ # Build sequence
446
+ #
447
+ # @param [Transform] transform
448
+ #
449
+ # @return [Transform]
450
+ def seq(transform)
451
+ self.class.new(steps + [transform])
452
+ end
453
+
422
454
  # Apply transformation to input
423
455
  #
424
456
  # @param [Object]
@@ -437,7 +469,7 @@ module Morpher
437
469
  end
438
470
  end # Sequence
439
471
 
440
- # Generic exception transformer
472
+ # Generic exception transform
441
473
  class Exception < self
442
474
  include Concord.new(:error_class, :block)
443
475
 
@@ -467,6 +499,19 @@ module Morpher
467
499
  end
468
500
  end # Success
469
501
 
502
+ # Transform accepting nil values
503
+ class Maybe < Transform
504
+ include Concord.new(:transform)
505
+
506
+ def call(input)
507
+ if input.nil?
508
+ success(nil)
509
+ else
510
+ transform.call(input).lmap(&method(:wrap_error))
511
+ end
512
+ end
513
+ end # Maybe
514
+
470
515
  BOOLEAN = Transform::Boolean.new
471
516
  FLOAT = Transform::Primitive.new(Float)
472
517
  INTEGER = Transform::Primitive.new(Integer)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: morpher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Markus Schirp
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-26 00:00:00.000000000 Z
11
+ date: 2021-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: abstract_type
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.3.0
55
- - !ruby/object:Gem::Dependency
56
- name: ast
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '2.2'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '2.2'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: concord
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -94,20 +80,6 @@ dependencies:
94
80
  - - "~>"
95
81
  - !ruby/object:Gem::Version
96
82
  version: 0.0.9
97
- - !ruby/object:Gem::Dependency
98
- name: ice_nine
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: 0.11.0
104
- type: :runtime
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: 0.11.0
111
83
  - !ruby/object:Gem::Dependency
112
84
  name: mprelude
113
85
  requirement: !ruby/object:Gem::Requirement
@@ -251,7 +223,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
251
223
  - !ruby/object:Gem::Version
252
224
  version: '0'
253
225
  requirements: []
254
- rubygems_version: 3.1.4
226
+ rubygems_version: 3.2.18
255
227
  signing_key:
256
228
  specification_version: 4
257
229
  summary: Domain Transformation Algebra