phlex 2.0.0.rc1 → 2.0.0.rc2

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: 4a6338c8f3742ef6e6bc493e259ba3681d9a651e79c067e030e4aaba8b889396
4
- data.tar.gz: b0f21d0994c3ec89bb16f4037997e1327e068e7dce4b9b9bad2355df95f40de8
3
+ metadata.gz: 35bbefcf5b9f49f4082f7b92e949e0dd5c13bb39fb65d435563ce6d93b8b002e
4
+ data.tar.gz: b5455009b59c52b2dc18364adcb4907dd17295b2fac82c42ee76dbe98106889c
5
5
  SHA512:
6
- metadata.gz: ff0f545fe87d54db6170264df314eaf9190a1ac5718fc66e905b295c66771b61bcf76a302c94df85d1242ba804790707bb387867e25685c112e402516fb2a58e
7
- data.tar.gz: 9b4b4615a772814e0b2bb9774802832bd007dd61a08ef5145e750fd43a5984327664050462e6f2cb82f57c9dc46d0d3858d29aa09404c62c9aa1d381c9b32b94
6
+ metadata.gz: 5f9a7b014d2821888a97afe5d822dcc04acede2623cfd2ac84d2ee9eb68aff30cf8e571b81d3c54cf3b344d06ea96de6f95b9a37213d5bb5acf805393150dccb
7
+ data.tar.gz: 1e940060016ea5d3ecf707bf33d0ad70ebb43e576825cb477be4a091eeec00787530cf8fb315e399196ae81c3cc88d8059e38ef6eeaeb816843f576a6124dc63
data/lib/phlex/fifo.rb CHANGED
@@ -7,7 +7,7 @@ class Phlex::FIFO
7
7
  @max_bytesize = max_bytesize
8
8
  @max_value_bytesize = max_value_bytesize
9
9
  @bytesize = 0
10
- @mutex = Mutex.new
10
+ @mutex = Monitor.new
11
11
  end
12
12
 
13
13
  attr_reader :bytesize, :max_bytesize
@@ -20,7 +20,7 @@ class Phlex::FIFO
20
20
 
21
21
  def [](key)
22
22
  k, v = @store[key.hash]
23
- v if k == key
23
+ v if k.eql?(key)
24
24
  end
25
25
 
26
26
  def []=(key, value)
@@ -32,7 +32,7 @@ class Phlex::FIFO
32
32
  # Check the key definitely doesn't exist now we have the lock
33
33
  return if @store[digest]
34
34
 
35
- @store[digest] = [key, value]
35
+ @store[digest] = [key, value].freeze
36
36
  @bytesize += value.bytesize
37
37
 
38
38
  while @bytesize > @max_bytesize
@@ -45,4 +45,11 @@ class Phlex::FIFO
45
45
  def size
46
46
  @store.size
47
47
  end
48
+
49
+ def clear
50
+ @mutex.synchronize do
51
+ @store.clear
52
+ @bytesize = 0
53
+ end
54
+ end
48
55
  end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ # An extremely fast in-memory cache store that evicts keys on a first-in-first-out basis.
4
+ class Phlex::FIFOCacheStore
5
+ def initialize(max_bytesize: 2 ** 20)
6
+ @fifo = Phlex::FIFO.new(
7
+ max_bytesize:,
8
+ max_value_bytesize: max_bytesize
9
+ )
10
+ end
11
+
12
+ def fetch(key)
13
+ fifo = @fifo
14
+ key = map_key(key)
15
+
16
+ if (result = fifo[key])
17
+ JSON.parse(result)
18
+ else
19
+ result = yield
20
+
21
+ fifo[key] = JSON.fast_generate(result)
22
+
23
+ result
24
+ end
25
+ end
26
+
27
+ def clear
28
+ @fifo.clear
29
+ end
30
+
31
+ private
32
+
33
+ def map_key(value)
34
+ case value
35
+ when Array
36
+ value.map { |it| map_key(it) }
37
+ when Hash
38
+ value.to_h { |k, v| [map_key(k), map_key(v)].freeze }
39
+ when String, Symbol, Integer, Float, Time, true, false, nil
40
+ value
41
+ else
42
+ if value.respond_to?(:cache_key)
43
+ map_key(value.cache_key)
44
+ else
45
+ raise ArgumentError.new("Invalid cache key: #{value.class}")
46
+ end
47
+ end
48
+ end
49
+ end
data/lib/phlex/helpers.rb CHANGED
@@ -7,7 +7,7 @@ module Phlex::Helpers
7
7
  def mix(*args)
8
8
  args.each_with_object({}) do |object, result|
9
9
  result.merge!(object) do |_key, old, new|
10
- case [old, new]
10
+ case [old, new].freeze
11
11
  in [Array, Array] | [Set, Set]
12
12
  old + new
13
13
  in [Array, Set]