evt-collection 1.0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: bf7cf1ffea012f90866505cffcab4b01b209fba5ae36cc3de37adbc1654b59bd
4
+ data.tar.gz: cda4e9c233671dd718ab8c2f8e1c54e2517ade74f1dc7232dddeacd4d8e46a1a
5
+ SHA512:
6
+ metadata.gz: dd6424fd2c49f7f332b393927e4ea8a856ed0b509abbd1098e3309b45fad99a0696ca4269a8748d6313c0fdfdb9733e0f589f7b7529850186498a0272d48b5ec
7
+ data.tar.gz: a74a0d5c6b443595cd23050218908cf3048c4e858793d48c323a03160e8ba6c8a91e7d4ac28fce15f17e1e6c9c9b6af598f443e294345675428246d92491c1d5
@@ -0,0 +1,5 @@
1
+ require 'set'
2
+
3
+ require 'collection/set'
4
+ require 'collection/refinement'
5
+ require 'collection/collection'
@@ -0,0 +1,5 @@
1
+ module Collection
2
+ def self.[](type_parameter)
3
+ Set[type_parameter]
4
+ end
5
+ end
@@ -0,0 +1,2 @@
1
+ require 'collection/controls/member'
2
+ require 'collection/controls/array'
@@ -0,0 +1,21 @@
1
+ module Collection
2
+ module Controls
3
+ module Array
4
+ def self.example
5
+ [Member.new, Member.new]
6
+ end
7
+
8
+ class Member
9
+ end
10
+
11
+ module Anomaly
12
+ def self.example
13
+ [Array::Member.new, Member.new]
14
+ end
15
+
16
+ class Member
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ module Collection
2
+ module Controls
3
+ module Member
4
+ def self.example
5
+ example_class.new
6
+ end
7
+
8
+ def self.example_class
9
+ Member
10
+ end
11
+
12
+ class Member
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ module Collection
2
+ refine Object do
3
+ def Collection(items)
4
+ items = Array(items)
5
+
6
+ raise ArgumentError, "Collection can't be empty" if items.empty?
7
+
8
+ type_parameter = items[0].class
9
+
10
+ set = Set[type_parameter].new
11
+
12
+ items.each do |member|
13
+ set.add member
14
+ end
15
+
16
+ set
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,97 @@
1
+ module Collection
2
+ class Set
3
+ include Enumerable
4
+
5
+ attr_reader :type_parameter
6
+
7
+ def initialize(type_parameter)
8
+ @type_parameter = type_parameter
9
+ end
10
+
11
+ def self.[](type_parameter)
12
+ type_parameter_name = constant_name(type_parameter)
13
+
14
+ cls = nil
15
+ unless const_defined?(type_parameter_name)
16
+ cls = define_class(type_parameter)
17
+ set_collection_constant(type_parameter, cls)
18
+ else
19
+ cls = const_get(type_parameter_name)
20
+ end
21
+
22
+ cls
23
+ end
24
+
25
+ def self.define_class(type_parameter)
26
+ cls = Class.new(self) do
27
+ def initialize; end
28
+
29
+ define_method :type_parameter do
30
+ type_parameter
31
+ end
32
+ end
33
+
34
+ set_collection_constant(type_parameter, cls)
35
+
36
+ cls
37
+ end
38
+
39
+ def self.constant_name(constant)
40
+ constant.name.gsub('::', '_')
41
+ end
42
+
43
+ def self.set_collection_constant(constant, cls)
44
+ class_name = constant_name(constant)
45
+
46
+ unless const_defined?(class_name)
47
+ self.const_set(class_name, cls)
48
+ end
49
+
50
+ class_name
51
+ end
52
+
53
+ def add(val)
54
+ raise ArgumentError, "#{val.inspect} must be a #{type_parameter.name}" unless val.is_a? type_parameter
55
+ set.add(val)
56
+ end
57
+ alias :<< :add
58
+
59
+ def entry?(val=nil, &predicate)
60
+ if !block_given?
61
+ predicate = lambda { |m| m == val }
62
+ end
63
+
64
+ entries(&predicate).length > 0
65
+ end
66
+
67
+ def entries(&predicate)
68
+ set.select(&predicate)
69
+ end
70
+
71
+ def entry(&predicate)
72
+ set.find(&predicate)
73
+ end
74
+
75
+ def each(&action)
76
+ set.each(&action)
77
+ end
78
+
79
+ def entries?
80
+ !set.empty?
81
+ end
82
+
83
+ def empty?
84
+ set.empty?
85
+ end
86
+
87
+ def length
88
+ set.length
89
+ end
90
+ alias :size :length
91
+ alias :count :length
92
+
93
+ private def set
94
+ @set ||= ::Set.new
95
+ end
96
+ end
97
+ end
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: evt-collection
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - The Eventide Project
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-12-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: test_bench
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: " "
28
+ email: opensource@eventide-project.org
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - lib/collection.rb
34
+ - lib/collection/collection.rb
35
+ - lib/collection/controls.rb
36
+ - lib/collection/controls/array.rb
37
+ - lib/collection/controls/member.rb
38
+ - lib/collection/refinement.rb
39
+ - lib/collection/set.rb
40
+ homepage: https://github.com/eventide-project/collection
41
+ licenses:
42
+ - MIT
43
+ metadata: {}
44
+ post_install_message:
45
+ rdoc_options: []
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 2.3.3
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ requirements: []
59
+ rubyforge_project:
60
+ rubygems_version: 2.7.3
61
+ signing_key:
62
+ specification_version: 4
63
+ summary: Type-checked set
64
+ test_files: []