l42_map 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []