time_scheduler 1.1.0 → 1.2.0

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