phlex 2.0.0.rc1 → 2.0.0.rc2

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: 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]