time_scheduler 1.1.0 → 1.2.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/lib/time_scheduler.rb +1 -0
- data/lib/time_scheduler/event.rb +1 -3
- data/lib/time_scheduler/order_set.rb +114 -0
- data/lib/time_scheduler/scheduler.rb +1 -1
- data/lib/time_scheduler/version.rb +1 -1
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b41d39f7c7f34c8101a730377bee9dabe4eb920c22dd133aa7263d07f965edd
|
4
|
+
data.tar.gz: 913b73cb0dd105ae110bbca3fa01acc8628714011433eafb220b7abad1ac6ca7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac3398eb1ae0676a6dd4dab20830c622cb23b67986493eec43a1f80d60a13b744d672ec5f653485858f7e13ce591aa496c7bbf54fc8ba6f77473b9d4112f33bb
|
7
|
+
data.tar.gz: 6d0c46f3d1dd3388b678ccd43acedc1a0d6434951506a72ceb6427b3dc09d4c35750635934e3446d3ac4ea1522fe19881918366cb81cf4980f559c1b83f05e97
|
data/lib/time_scheduler.rb
CHANGED
data/lib/time_scheduler/event.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require "set"
|
2
1
|
|
3
2
|
class TimeScheduler
|
4
3
|
|
@@ -28,7 +27,7 @@ class TimeScheduler
|
|
28
27
|
def initialize( **option )
|
29
28
|
@event_mutex = ::Mutex.new
|
30
29
|
@event_queue = ::Queue.new
|
31
|
-
@event_set =
|
30
|
+
@event_set = OrderSet.new
|
32
31
|
run
|
33
32
|
end
|
34
33
|
|
@@ -62,7 +61,6 @@ class TimeScheduler
|
|
62
61
|
@event_queue.pop
|
63
62
|
@event_mutex.synchronize do
|
64
63
|
event_item = @event_set.first
|
65
|
-
|
66
64
|
now = Time.now
|
67
65
|
if event_item.time <= now
|
68
66
|
@event_set.delete( event_item )
|
@@ -0,0 +1,114 @@
|
|
1
|
+
#
|
2
|
+
# OrderSet implements a Set that guarantees that its elements are
|
3
|
+
# yielded in sorted order (according to the return values of their
|
4
|
+
# #<=> methods) when iterating over them.
|
5
|
+
#
|
6
|
+
# All elements that are added to a OrderSet must respond to the <=>
|
7
|
+
# method for comparison.
|
8
|
+
#
|
9
|
+
# Also, all elements must be <em>mutually comparable</em>: <tt>el1 <=>
|
10
|
+
# el2</tt> must not return <tt>nil</tt> for any elements <tt>el1</tt>
|
11
|
+
# and <tt>el2</tt>, else an ArgumentError will be raised when
|
12
|
+
# iterating over the OrderSet.
|
13
|
+
#
|
14
|
+
# == Example
|
15
|
+
#
|
16
|
+
# require "set"
|
17
|
+
#
|
18
|
+
# set = OrderSet.new([2, 1, 5, 6, 4, 5, 3, 3, 3])
|
19
|
+
# ary = []
|
20
|
+
#
|
21
|
+
# set.each do |obj|
|
22
|
+
# ary << obj
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# p ary # => [1, 2, 3, 4, 5, 6]
|
26
|
+
#
|
27
|
+
# set2 = OrderSet.new([1, 2, "3"])
|
28
|
+
# set2.each { |obj| } # => raises ArgumentError: comparison of Fixnum with String failed
|
29
|
+
#
|
30
|
+
|
31
|
+
require "set"
|
32
|
+
|
33
|
+
class TimeScheduler
|
34
|
+
class OrderSet < Set
|
35
|
+
|
36
|
+
class << self
|
37
|
+
def [](*ary) # :nodoc:
|
38
|
+
new(ary)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def initialize(*args)
|
43
|
+
@keys = nil
|
44
|
+
super
|
45
|
+
end
|
46
|
+
|
47
|
+
def clear
|
48
|
+
@keys = nil
|
49
|
+
super
|
50
|
+
end
|
51
|
+
|
52
|
+
def replace(enum)
|
53
|
+
@keys = nil
|
54
|
+
super
|
55
|
+
end
|
56
|
+
|
57
|
+
def add(o)
|
58
|
+
o.respond_to?(:<=>) or raise ArgumentError, "value must respond to <=>"
|
59
|
+
@keys = nil
|
60
|
+
super
|
61
|
+
end
|
62
|
+
alias << add
|
63
|
+
|
64
|
+
def delete(o)
|
65
|
+
@keys = nil
|
66
|
+
@hash.delete(o)
|
67
|
+
self
|
68
|
+
end
|
69
|
+
|
70
|
+
def delete_if
|
71
|
+
block_given? or return enum_for(__method__) { size }
|
72
|
+
n = @hash.size
|
73
|
+
super
|
74
|
+
@keys = nil if @hash.size != n
|
75
|
+
self
|
76
|
+
end
|
77
|
+
|
78
|
+
def keep_if
|
79
|
+
block_given? or return enum_for(__method__) { size }
|
80
|
+
n = @hash.size
|
81
|
+
super
|
82
|
+
@keys = nil if @hash.size != n
|
83
|
+
self
|
84
|
+
end
|
85
|
+
|
86
|
+
def merge(enum)
|
87
|
+
@keys = nil
|
88
|
+
super
|
89
|
+
end
|
90
|
+
|
91
|
+
def each(&block)
|
92
|
+
block or return enum_for(__method__) { size }
|
93
|
+
to_a.each(&block)
|
94
|
+
self
|
95
|
+
end
|
96
|
+
|
97
|
+
def to_a
|
98
|
+
(@keys = @hash.keys).sort! unless @keys
|
99
|
+
@keys
|
100
|
+
end
|
101
|
+
|
102
|
+
def freeze
|
103
|
+
to_a
|
104
|
+
super
|
105
|
+
end
|
106
|
+
|
107
|
+
def rehash
|
108
|
+
@keys = nil
|
109
|
+
super
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: time_scheduler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- arimay
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-12-
|
11
|
+
date: 2020-12-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: time_cursor
|
@@ -70,6 +70,7 @@ files:
|
|
70
70
|
- bin/setup
|
71
71
|
- lib/time_scheduler.rb
|
72
72
|
- lib/time_scheduler/event.rb
|
73
|
+
- lib/time_scheduler/order_set.rb
|
73
74
|
- lib/time_scheduler/scheduler.rb
|
74
75
|
- lib/time_scheduler/version.rb
|
75
76
|
- sample/base_1.rb
|
@@ -94,7 +95,7 @@ homepage: https://github.com/arimay/time_scheduler
|
|
94
95
|
licenses:
|
95
96
|
- MIT
|
96
97
|
metadata: {}
|
97
|
-
post_install_message:
|
98
|
+
post_install_message:
|
98
99
|
rdoc_options: []
|
99
100
|
require_paths:
|
100
101
|
- lib
|
@@ -109,8 +110,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
110
|
- !ruby/object:Gem::Version
|
110
111
|
version: '0'
|
111
112
|
requirements: []
|
112
|
-
rubygems_version: 3.
|
113
|
-
signing_key:
|
113
|
+
rubygems_version: 3.2.3
|
114
|
+
signing_key:
|
114
115
|
specification_version: 4
|
115
116
|
summary: Library for simple event scheduler.
|
116
117
|
test_files: []
|