bogo 0.1.8 → 0.1.10

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
  SHA1:
3
- metadata.gz: 4c5c90b42afcd5854ba741a6f0da9469a6d548bd
4
- data.tar.gz: 1ae80d7c320ade21655bd0dd8b3f88b876341bb3
3
+ metadata.gz: f4b61b319c9395e4e644f827551a4af16deb76e9
4
+ data.tar.gz: dc1442544264f65268c3f7ef9125c9baeb763d00
5
5
  SHA512:
6
- metadata.gz: 8363d5481480cd9741d14407f8b67222085ac81a04d9844494b3729b0dc1d70d51e0c126484c76eb3bf57d6bc7868dd95e448bfd65a10d061670092dae6459ff
7
- data.tar.gz: 36aac8260f6f7673ab7e37ac7aabb039dbf0037e97371d0b1af7ec31e5e878b53dae610d2005795db20c6b66e40b360c9f4f904a942d99e746193be699cf794c
6
+ metadata.gz: 5170908a533fab6acc5b7d757b24a0e59155913965bffb7bdb416fa4ce9e2ac87efa3739881c87e9cc5746ea152583e8f6ce21a6a13a49819f47f42d9c0a00f5
7
+ data.tar.gz: abd76ee307dc9fdc7761b7d5ed31d783ae7ce6208d5a712bdf134cbc9eee43464e9d40d75d3392c2909fb6eb8fdc215dd7d73792063998bf84c840bfccfd064f
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## v0.1.10
2
+ * Add `Lazy#always_clean!` to remove attribute state
3
+ * Add `PriorityQueue`
4
+
1
5
  ## v0.1.8
2
6
  * Use `#to_smash` to for duping to preserve types
3
7
  * Force type on merges
data/bogo.gemspec CHANGED
@@ -10,7 +10,9 @@ Gem::Specification.new do |s|
10
10
  s.description = 'Helper libraries'
11
11
  s.require_path = 'lib'
12
12
  s.license = 'Apache 2.0'
13
- s.add_dependency 'hashie'
14
- s.add_dependency 'multi_json'
13
+ s.add_runtime_dependency 'hashie'
14
+ s.add_runtime_dependency 'multi_json'
15
+ s.add_development_dependency 'pry'
16
+ s.add_development_dependency 'minitest'
15
17
  s.files = Dir['lib/**/*'] + %w(bogo.gemspec README.md CHANGELOG.md CONTRIBUTING.md LICENSE)
16
18
  end
data/lib/bogo.rb CHANGED
@@ -5,6 +5,7 @@ module Bogo
5
5
  autoload :Constants, 'bogo/constants'
6
6
  autoload :Lazy, 'bogo/lazy'
7
7
  autoload :Memoization, 'bogo/memoization'
8
+ autoload :PriorityQueue, 'bogo/priority_queue'
8
9
  autoload :Smash, 'bogo/smash'
9
10
  autoload :Utility, 'bogo/utility'
10
11
  end
data/lib/bogo/lazy.rb CHANGED
@@ -103,6 +103,15 @@ module Bogo
103
103
  # Class methods for laziness
104
104
  module ClassMethods
105
105
 
106
+ # Disable dirty state
107
+ def always_clean!
108
+ self.class_eval do
109
+ def dirty?; false; end
110
+ def valid_state; self; end
111
+ alias_method :dirty, :data
112
+ end
113
+ end
114
+
106
115
  # Add new attributes to class
107
116
  #
108
117
  # @param name [String]
@@ -0,0 +1,80 @@
1
+ require 'bogo'
2
+
3
+ module Bogo
4
+ # Specialized priority based queue
5
+ # @note does not allow duplicate objects to be queued
6
+ class PriorityQueue
7
+
8
+ # Create a new priority queue
9
+ #
10
+ # @return [self]
11
+ def initialize(*args)
12
+ @lock = Mutex.new
13
+ @queue = Hash.new
14
+ @block_costs = 0
15
+ @reverse_sort = args.include?(:highscore)
16
+ end
17
+
18
+ # Push new item to the queue
19
+ #
20
+ # @param item [Object]
21
+ # @param cost [Float]
22
+ # @yield provide cost via proc
23
+ # @return [self]
24
+ def push(item, cost=nil, &block)
25
+ lock.synchronize do
26
+ if(queue[item])
27
+ raise ArgumentError.new "Item already exists in queue. Items must be unique! (#{item})"
28
+ end
29
+ unless(cost || block_given?)
30
+ raise ArgumentError.new 'Cost must be provided as parameter or block!'
31
+ end
32
+ @block_costs += 1 if cost.nil?
33
+ queue[item] = cost || block
34
+ sort!
35
+ end
36
+ self
37
+ end
38
+
39
+ # @return [Object, NilClass] item or nil if empty
40
+ def pop
41
+ lock.synchronize do
42
+ sort! if @block_costs > 0
43
+ item, score = queue.first
44
+ @block_costs -= 1 if score.respond_to?(:call)
45
+ queue.delete(item)
46
+ item
47
+ end
48
+ end
49
+
50
+ # @return [Integer] current size of queue
51
+ def size
52
+ lock.synchronize do
53
+ queue.size
54
+ end
55
+ end
56
+
57
+ def empty?
58
+ size == 0
59
+ end
60
+
61
+ # Sort the queue based on cost
62
+ def sort!
63
+ queue.replace(
64
+ Hash[
65
+ queue.sort do |x,y|
66
+ x,y = y,x if @reverse_score
67
+ (x.last.respond_to?(:call) ? x.last.call : x.last).to_f <=>
68
+ (y.last.respond_to?(:call) ? y.last.call : y.last).to_f
69
+ end
70
+ ]
71
+ )
72
+ end
73
+
74
+ protected
75
+
76
+ attr_reader :queue, :lock
77
+
78
+ end
79
+
80
+ end
data/lib/bogo/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Bogo
2
2
  # Current library version
3
- VERSION = Gem::Version.new('0.1.8')
3
+ VERSION = Gem::Version.new('0.1.10')
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bogo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.1.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Roberts
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-12 00:00:00.000000000 Z
11
+ date: 2015-02-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
@@ -38,6 +38,34 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
41
69
  description: Helper libraries
42
70
  email: code@chrisroberts.org
43
71
  executables: []
@@ -54,6 +82,7 @@ files:
54
82
  - lib/bogo/constants.rb
55
83
  - lib/bogo/lazy.rb
56
84
  - lib/bogo/memoization.rb
85
+ - lib/bogo/priority_queue.rb
57
86
  - lib/bogo/smash.rb
58
87
  - lib/bogo/utility.rb
59
88
  - lib/bogo/version.rb