foobara-lru-cache 0.0.1 → 1.0.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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/lib/foobara/lru_cache.rb +62 -19
  4. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 752fea9f8a8c09190e16fea3e710e2d860dbaad38b0c3bbc55aac543a4d36842
4
- data.tar.gz: 35413dc39e7b39b9ab4553cbef65f857800f8c2cfa0a383737d8b4142cad4ec4
3
+ metadata.gz: 3fd52863c57fef5ebf89300971b3a1909d1b058164f3fc4f0a89b9412a964156
4
+ data.tar.gz: d274bf70bd2933271c9b410eda41b94a1157e1a1cf425966882037bb567824a9
5
5
  SHA512:
6
- metadata.gz: 3565ef92e71359a98c1dab733dd13032110fbc64906525419d6c999001ea7804a7fdcb1ec3fd0aff167dd42ad58005f3bb2bae9d9bcc4cb2fcd6eb5b4fedeb16
7
- data.tar.gz: 3360bf084aa44837a4718185e65674398dadee3e19c15317f5e861507fc636d807cd33a2e9f1cd1c858af631db15b4f98be35f7df89ecc32e8fb22cab6cf5a95
6
+ metadata.gz: 79427815520d395a417da9334508e0fc009f6972585685c8301b01ecfa07bce54a1334cf8214c2c2288540d534da94ae45d417b61141ac55d4b953a976deddc5
7
+ data.tar.gz: 161728aa38fbc22aa2fab42df16756969e6e55fb328b941d2b42b1f5c4dcded770702953e85e4faca44135c216b6d7261b1bb0ad02756cff91b4b15373913de3
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## [1.0.0] - 2025-08-10
2
+
3
+ - Add #get/#set_if_missing to facilitate non-block use-cases
4
+
5
+ ## [0.0.2] - 2025-02-28
6
+
7
+ - Fix bug that corrupts the cache
8
+ - Make the cached method thread-safe
9
+ - Add #reset!
10
+
1
11
  ## [0.0.1] - 2025-02-27
2
12
 
3
13
  - Release as a gem
@@ -21,42 +21,85 @@ 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
+
34
+ mutex.synchronize do
35
+ if @key_to_node.key?(key)
36
+ node = @key_to_node[key]
37
+ move_node_to_front(node)
38
+ else
39
+ node = Node.new(key, value)
40
+ @key_to_node[key] = node
41
+ prepend_node(node)
42
+ end
34
43
  end
44
+
45
+ value
35
46
  end
36
47
 
37
48
  def key?(key)
38
49
  @key_to_node.key?(key)
39
50
  end
40
51
 
52
+ def get(key)
53
+ mutex.synchronize do
54
+ if @key_to_node.key?(key)
55
+ node = @key_to_node[key]
56
+ move_node_to_front(node)
57
+ return true, node.value
58
+ end
59
+ end
60
+ end
61
+
62
+ def set_if_missing(key, value)
63
+ mutex.synchronize do
64
+ unless @key_to_node.key?(key)
65
+ node = Node.new(key, value)
66
+ @key_to_node[key] = node
67
+ prepend_node(node)
68
+ end
69
+ end
70
+ end
71
+
72
+ def reset!
73
+ mutex.synchronize do
74
+ @size = 0
75
+ @key_to_node.clear
76
+ @head = @tail = nil
77
+ end
78
+ end
79
+
41
80
  private
42
81
 
82
+ def mutex
83
+ @mutex ||= Mutex.new
84
+ end
85
+
43
86
  def move_node_to_front(node)
44
87
  return if node == @head
45
88
 
46
- if node == @tail
47
- @tail = node.prev
48
- end
49
-
50
89
  prev_node = node.prev
90
+ next_node = node.next
51
91
 
52
- node.prev = nil
53
- prev_node.next = node.next
54
-
55
- if node.next
56
- node.next.prev = prev_node
92
+ if node == @tail
93
+ @tail = prev_node
94
+ @tail.next = nil
95
+ else
96
+ prev_node.next = next_node
97
+ next_node.prev = prev_node
57
98
  end
58
99
 
100
+ @head.prev = node
59
101
  node.next = @head
102
+ node.prev = nil
60
103
  @head = node
61
104
  end
62
105
 
metadata CHANGED
@@ -1,13 +1,13 @@
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: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miles Georgi
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-02-28 00:00:00.000000000 Z
10
+ date: 2025-08-10 00:00:00.000000000 Z
11
11
  dependencies: []
12
12
  email:
13
13
  - azimux@gmail.com
@@ -43,7 +43,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
43
43
  - !ruby/object:Gem::Version
44
44
  version: '0'
45
45
  requirements: []
46
- rubygems_version: 3.6.3
46
+ rubygems_version: 3.6.2
47
47
  specification_version: 4
48
48
  summary: Basic least-recently-used cache implementation
49
49
  test_files: []