foobara-lru-cache 0.0.1 → 0.0.2

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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/lib/foobara/lru_cache.rb +41 -19
  4. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 752fea9f8a8c09190e16fea3e710e2d860dbaad38b0c3bbc55aac543a4d36842
4
- data.tar.gz: 35413dc39e7b39b9ab4553cbef65f857800f8c2cfa0a383737d8b4142cad4ec4
3
+ metadata.gz: ad9e286058d8549c8afada45a9f4f648f0b5e74966e55ae306912f7b70ef0f9e
4
+ data.tar.gz: f90e2f9c733371f785d7a11b788f1289f33ad011256b28cefb986ecf73216645
5
5
  SHA512:
6
- metadata.gz: 3565ef92e71359a98c1dab733dd13032110fbc64906525419d6c999001ea7804a7fdcb1ec3fd0aff167dd42ad58005f3bb2bae9d9bcc4cb2fcd6eb5b4fedeb16
7
- data.tar.gz: 3360bf084aa44837a4718185e65674398dadee3e19c15317f5e861507fc636d807cd33a2e9f1cd1c858af631db15b4f98be35f7df89ecc32e8fb22cab6cf5a95
6
+ metadata.gz: c0bc7897734a9685fc710092f1b208694c567dbdfabdfac87357484011f67cbee0ed36edb9563614914965266faeb6af322ac0095c2c653cfb8f76902bae513e
7
+ data.tar.gz: 6ef2c8384a6a9a978fcb314e54ff64ced52e6e7c06073d4beb9faf41e2959fdfb565ae7bcf302c127d6d9d27809e9f71fd13e45fa8e6a5fd8e42a269fd3aa87e
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## [0.0.2] - 2025-02-28
2
+
3
+ - Fix bug that corrupts the cache
4
+ - Make the cached method thread-safe
5
+ - Add #reset!
6
+
1
7
  ## [0.0.1] - 2025-02-27
2
8
 
3
9
  - Release as a gem
@@ -21,42 +21,64 @@ module Foobara
21
21
  end
22
22
 
23
23
  def cached(key)
24
- if @key_to_node.key?(key)
25
- node = @key_to_node[key]
26
- move_node_to_front(node)
27
- node.value
28
- else
29
- value = yield
30
- node = Node.new(key, value)
31
- @key_to_node[key] = node
32
- prepend_node(node)
33
- value
24
+ mutex.synchronize do
25
+ if @key_to_node.key?(key)
26
+ node = @key_to_node[key]
27
+ move_node_to_front(node)
28
+ return node.value
29
+ end
30
+ end
31
+
32
+ value = yield
33
+ mutex.synchronize do
34
+ if @key_to_node.key?(key)
35
+ node = @key_to_node[key]
36
+ move_node_to_front(node)
37
+ else
38
+ node = Node.new(key, value)
39
+ @key_to_node[key] = node
40
+ prepend_node(node)
41
+ end
34
42
  end
43
+
44
+ value
35
45
  end
36
46
 
37
47
  def key?(key)
38
48
  @key_to_node.key?(key)
39
49
  end
40
50
 
51
+ def reset!
52
+ mutex.synchronize do
53
+ @size = 0
54
+ @key_to_node.clear
55
+ @head = @tail = nil
56
+ end
57
+ end
58
+
41
59
  private
42
60
 
61
+ def mutex
62
+ @mutex ||= Mutex.new
63
+ end
64
+
43
65
  def move_node_to_front(node)
44
66
  return if node == @head
45
67
 
46
- if node == @tail
47
- @tail = node.prev
48
- end
49
-
50
68
  prev_node = node.prev
69
+ next_node = node.next
51
70
 
52
- node.prev = nil
53
- prev_node.next = node.next
54
-
55
- if node.next
56
- node.next.prev = prev_node
71
+ if node == @tail
72
+ @tail = prev_node
73
+ @tail.next = nil
74
+ else
75
+ prev_node.next = next_node
76
+ next_node.prev = prev_node
57
77
  end
58
78
 
79
+ @head.prev = node
59
80
  node.next = @head
81
+ node.prev = nil
60
82
  @head = node
61
83
  end
62
84
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foobara-lru-cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miles Georgi