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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0e58dc40f89e8573c41d5817583a7146d359d70077761dbbe92fadd6eb8096b3
4
- data.tar.gz: 73d28d42cea43c9b96fae6c65b3d032ad2f4c29c5e00396b245e40cf4f872229
3
+ metadata.gz: 3b41d39f7c7f34c8101a730377bee9dabe4eb920c22dd133aa7263d07f965edd
4
+ data.tar.gz: 913b73cb0dd105ae110bbca3fa01acc8628714011433eafb220b7abad1ac6ca7
5
5
  SHA512:
6
- metadata.gz: 469f48427b2a4dc21d4ce6a52f6d744274befe725cad72f79e5996c459419b0c9c4f30d3dcabc5926e012e41f95df4197978c4b7d77b0767b21fee7428edbeef
7
- data.tar.gz: 560d58d6fc0ad2e8f54e50df8ceacd0839f37c85a86dab3de68cb3d99660cc74d13d2d8f70494012cb51f12bed5c4dda994d30fb86ea1bf517ece3280cc48638
6
+ metadata.gz: ac3398eb1ae0676a6dd4dab20830c622cb23b67986493eec43a1f80d60a13b744d672ec5f653485858f7e13ce591aa496c7bbf54fc8ba6f77473b9d4112f33bb
7
+ data.tar.gz: 6d0c46f3d1dd3388b678ccd43acedc1a0d6434951506a72ceb6427b3dc09d4c35750635934e3446d3ac4ea1522fe19881918366cb81cf4980f559c1b83f05e97
@@ -1,4 +1,5 @@
1
1
  require "time_scheduler/version"
2
+ require "time_scheduler/order_set"
2
3
  require "time_scheduler/event"
3
4
  require "time_scheduler/scheduler"
4
5
 
@@ -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 = ::SortedSet.new
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
+
@@ -73,7 +73,7 @@ class TimeScheduler
73
73
 
74
74
  next if @@pause
75
75
 
76
- ::Thread.start( time ) do
76
+ ::Thread.start( time ) do |time|
77
77
  @schedule_mutex.synchronize do
78
78
  @action.call( time )
79
79
  end
@@ -1,3 +1,3 @@
1
1
  class TimeScheduler
2
- VERSION = "1.1.0"
2
+ VERSION = "1.2.0"
3
3
  end
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.1.0
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-14 00:00:00.000000000 Z
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.1.4
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: []