ruby-optics 0.0.1 → 0.1.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/README.md +92 -3
- data/lib/ruby-optics.rb +1 -1
- data/lib/ruby-optics/record/record.rb +3 -2
- 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: 940e5fe97670b6b7f24cc4bc52036f68ae81655746d5c869a572738ee063be36
|
4
|
+
data.tar.gz: 83b101c570650bb94bea1da8bee87031397ff2ad2947beca8cab16a95cce541b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff68227c0e6702687bbe1c2bb7fa47a91fcf6ed96121f0405e846030466b498bdcac482899d4c5563129f82ff64d0c2c4e669355789fc3d5930eb62bab1a2164
|
7
|
+
data.tar.gz: fd2f4c09fa8ad9231f06ebc2b1b2823afd662d94096f95f69f010e962d146dff9bdb537178cff27dcb523d2cd5d7ed6cb604c695855cec29ab738c55edf36084
|
data/README.md
CHANGED
@@ -2,13 +2,102 @@
|
|
2
2
|
|
3
3
|
Simple library with common functional optics for Ruby.
|
4
4
|
|
5
|
-
## Links
|
6
|
-
|
7
5
|
## Supported Ruby versions
|
8
6
|
|
9
7
|
This library officially supports the following Ruby versions:
|
10
8
|
|
11
|
-
* MRI
|
9
|
+
* MRI = `2.5.0`
|
10
|
+
|
11
|
+
## Installation
|
12
|
+
|
13
|
+
Add this to your Gemfile
|
14
|
+
```ruby
|
15
|
+
gem 'ruby-optics'
|
16
|
+
```
|
17
|
+
|
18
|
+
and then run
|
19
|
+
|
20
|
+
```
|
21
|
+
bundle install
|
22
|
+
```
|
23
|
+
|
24
|
+
Or install it manually
|
25
|
+
|
26
|
+
```
|
27
|
+
gem install ruby-optics
|
28
|
+
```
|
29
|
+
|
30
|
+
## Usage
|
31
|
+
|
32
|
+
Lens - is an object which encapsulates getter/setter functionality for immutable data in composable way.
|
33
|
+
Any lens consist of two functions `set` and `get`. `get` describes how can retrieve a value from a whole object, and `set` - how to update this value without mutating the object.
|
34
|
+
|
35
|
+
Example for getting/setting value by key from hash:
|
36
|
+
```ruby
|
37
|
+
def hash_get(key)
|
38
|
+
-> (hash) { hash[key] }
|
39
|
+
end
|
40
|
+
|
41
|
+
def hash_set(key)
|
42
|
+
-> (new_value, hash) { hash.merge(key => new_value) }
|
43
|
+
end
|
44
|
+
```
|
45
|
+
|
46
|
+
To create lens you need to specify both these functions:
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
lens = Lens.new(hash_get(:foo), hash_set(:foo))
|
50
|
+
```
|
51
|
+
|
52
|
+
Then you can use the lens to retrieve, set and modify value by the key in arbitrary hash:
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
object = { foo: 1, bar: 2 }
|
56
|
+
|
57
|
+
lens.get(object)
|
58
|
+
=> 2
|
59
|
+
|
60
|
+
lens.set(3, object)
|
61
|
+
=> { foo: 3, bar: 2 }
|
62
|
+
|
63
|
+
lens.modify(object) { |foo| foo * 10 }
|
64
|
+
=> { foo: 10, bar: 2 }
|
65
|
+
|
66
|
+
object
|
67
|
+
=> { foo: 1, bar: 2 }
|
68
|
+
```
|
69
|
+
|
70
|
+
Note that `set` and `modify` operations don't mutate original value, thus keeping it unchanged.
|
71
|
+
|
72
|
+
The real power of lens comes from their compositional properties, which allows to creates lenses that works with arbitrary nested
|
73
|
+
objects by composing them from simpler ones.
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
foo_lens = Lens.new(hash_get(:foo), hash_set(:foo))
|
77
|
+
bar_lens = Lens.new(hash_get(:bar), hash_set(:bar))
|
78
|
+
|
79
|
+
lens = foo_lens.compose_lens(bar_lens)
|
80
|
+
|
81
|
+
object = { foo: { bar: 1 } }
|
82
|
+
|
83
|
+
lens.get(object)
|
84
|
+
=> 1
|
85
|
+
|
86
|
+
lens.set(3, object)
|
87
|
+
=> { foo: { bar: 3 } }
|
88
|
+
|
89
|
+
lens.modify(object) { |foo| foo * 10 }
|
90
|
+
=> { foo: { bar: 10 } }
|
91
|
+
|
92
|
+
object
|
93
|
+
=> { foo: { bar: 1 } }
|
94
|
+
```
|
95
|
+
|
96
|
+
The library provides lens constructors for common cases, so you don't need to composes lenses yourself
|
97
|
+
```ruby
|
98
|
+
lens = Optics.hash_lens(:foo, :bar)
|
99
|
+
```
|
100
|
+
|
12
101
|
|
13
102
|
## License
|
14
103
|
|
data/lib/ruby-optics.rb
CHANGED
@@ -12,10 +12,11 @@ module Record
|
|
12
12
|
attribute_name = defined_attribute_params[:attribute_name]
|
13
13
|
attribute_argument = args_hash[attribute_name]
|
14
14
|
if attribute_argument.nil?
|
15
|
-
|
15
|
+
default_value = defined_attribute_params[:default]
|
16
|
+
if defined_attribute_params[:nullable] || default_value
|
16
17
|
instance_variable_set(
|
17
18
|
:"@#{attribute_name}",
|
18
|
-
|
19
|
+
default_value
|
19
20
|
)
|
20
21
|
else
|
21
22
|
raise ArgumentError.new(
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-optics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniil Bober
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-06-
|
11
|
+
date: 2020-06-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|