l42_map 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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: acc7207216b8e97faa4c219a2764e600331075c49fc7d53ba58f4386b724d2ed
4
+ data.tar.gz: 57e668a4b1ce4a9d8087aa92d4149f4fea3968da6b60b9b9079781060a0b3d04
5
+ SHA512:
6
+ metadata.gz: aeb1ebc407ba571c7e49dcf9a342e044e0590d540c071746c3e7dbdb53a518cf0eeced26dc8e2bc06d0fd5a20f24138d00df98a3d7079462cd04277614c95984
7
+ data.tar.gz: a89558d011a888343736f301afb13f7b15b12e385a2945413302bb1004364d9db46e6207be3cb785e3d93e3021120c4b8bfa4abaf1140cad0fbaebcfb447c4af
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module L42
4
+ class Map
5
+ module Api
6
+ def [](key)
7
+ hash[key]
8
+ end
9
+
10
+ def empty?
11
+ hash.empty?
12
+ end
13
+
14
+ def fetch(*args, &blk)
15
+ hash.fetch(*args, &blk)
16
+ end
17
+
18
+ def merge(*args, &blk)
19
+ hash1 = hash.merge(*args, &blk)
20
+ _clone(hash1)
21
+ end
22
+
23
+ def slice(*keys)
24
+ hash1 = hash.slice(*keys)
25
+ _clone(hash1)
26
+ end
27
+
28
+ def to_h; hash end
29
+
30
+ def without(*keys)
31
+ slice(*(hash.keys - keys))
32
+ end
33
+ end
34
+ end
35
+ end
36
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module L42
4
+ class Map
5
+ module EnumerableApi
6
+ include Enumerable
7
+ def each(&blk)
8
+ hash.each(&blk)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../map'
4
+
5
+ Map = L42::Map
6
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module L42
4
+ class Map
5
+ VERSION = '0.1.0'
6
+ end
7
+ end
8
+ # SPDX-License-Identifier: Apache-2.0
data/lib/l42/map.rb ADDED
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'map/api'
4
+ require_relative 'map/enumerable_api'
5
+ module L42
6
+ class Map
7
+ RestrictedNames = %i[
8
+ empty? fetch merge slice to_h with_default without
9
+ ].freeze
10
+
11
+ include Api
12
+ include EnumerableApi
13
+
14
+ def ==(other)
15
+ self.class == other.class && hash == other.to_h
16
+ end
17
+
18
+ def with_default(default)
19
+ @default = default
20
+ _define_method_missing
21
+ self
22
+ end
23
+
24
+ private
25
+ attr_accessor :default, :hash
26
+
27
+ def initialize(**kwds)
28
+ @default = nil
29
+ @hash = kwds
30
+ (kwds.keys - RestrictedNames).each(&_define_accessor_method)
31
+ end
32
+
33
+ def _clone(with_hash)
34
+ self.class.new(**with_hash).tap do |new_instance|
35
+ new_instance.with_default(default) if default
36
+ end
37
+ end
38
+
39
+ def _define_accessor_method
40
+ ->key do
41
+ class << self; self end.module_eval do
42
+ define_method key do
43
+ hash[key]
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ def _define_method_missing
50
+ class << self; self end.module_eval do
51
+ define_method :method_missing do |_name|
52
+ default
53
+ end
54
+ end
55
+ end
56
+
57
+ end
58
+ end
59
+ # SPDX-License-Identifier: Apache-2.0
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: l42_map
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Robert Dober
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-09-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: speculate_about
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.0.2
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.2
27
+ description: Immutable OpenStruct On Steroids
28
+ email: robert.dober@gmail.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - lib/l42/map.rb
34
+ - lib/l42/map/api.rb
35
+ - lib/l42/map/enumerable_api.rb
36
+ - lib/l42/map/global.rb
37
+ - lib/l42/map/version.rb
38
+ homepage: https://github.com/robertdober/l42_map
39
+ licenses:
40
+ - Apache-2.0
41
+ metadata: {}
42
+ post_install_message:
43
+ rdoc_options: []
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 3.1.0
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ requirements: []
57
+ rubygems_version: 3.3.7
58
+ signing_key:
59
+ specification_version: 4
60
+ summary: Immutable OpenStruct On Steroids
61
+ test_files: []