typed_cache 0.1.1 → 0.3.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 (87) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +139 -20
  4. data/examples.md +140 -50
  5. data/lib/typed_cache/backends/active_support.rb +50 -5
  6. data/lib/typed_cache/backends/memory.rb +14 -11
  7. data/lib/typed_cache/backends.rb +6 -8
  8. data/lib/typed_cache/cache_builder.rb +72 -19
  9. data/lib/typed_cache/cache_key.rb +11 -1
  10. data/lib/typed_cache/cache_ref.rb +20 -16
  11. data/lib/typed_cache/clock.rb +31 -14
  12. data/lib/typed_cache/decorator.rb +25 -0
  13. data/lib/typed_cache/decorators/instrumented.rb +92 -0
  14. data/lib/typed_cache/decorators.rb +7 -3
  15. data/lib/typed_cache/either.rb +22 -0
  16. data/lib/typed_cache/errors.rb +9 -1
  17. data/lib/typed_cache/instrumenter.rb +43 -0
  18. data/lib/typed_cache/instrumenters/active_support.rb +28 -0
  19. data/lib/typed_cache/instrumenters/mixins/namespaced_singleton.rb +55 -0
  20. data/lib/typed_cache/instrumenters/mixins.rb +8 -0
  21. data/lib/typed_cache/instrumenters/monitor.rb +27 -0
  22. data/lib/typed_cache/instrumenters/null.rb +26 -0
  23. data/lib/typed_cache/instrumenters.rb +39 -0
  24. data/lib/typed_cache/maybe.rb +18 -0
  25. data/lib/typed_cache/namespace.rb +33 -6
  26. data/lib/typed_cache/railtie.rb +15 -0
  27. data/lib/typed_cache/registry.rb +15 -0
  28. data/lib/typed_cache/snapshot.rb +18 -10
  29. data/lib/typed_cache/store.rb +50 -15
  30. data/lib/typed_cache/version.rb +1 -1
  31. data/lib/typed_cache.rb +34 -14
  32. data/rbi/typed_cache/backend.rbi +9 -0
  33. data/rbi/typed_cache/backends/active_support.rbi +13 -0
  34. data/rbi/typed_cache/backends/memory.rbi +13 -0
  35. data/rbi/typed_cache/backends.rbi +19 -0
  36. data/rbi/typed_cache/cache_builder.rbi +23 -0
  37. data/rbi/typed_cache/cache_key.rbi +16 -0
  38. data/rbi/typed_cache/cache_ref.rbi +56 -0
  39. data/rbi/typed_cache/decorator.rbi +67 -0
  40. data/rbi/typed_cache/decorators/instrumented.rbi +13 -0
  41. data/rbi/typed_cache/decorators.rbi +19 -0
  42. data/rbi/typed_cache/either.rbi +122 -0
  43. data/rbi/typed_cache/errors.rbi +20 -0
  44. data/rbi/typed_cache/instrumenter.rbi +45 -0
  45. data/rbi/typed_cache/instrumenters/mixins/namedspaced_singleton.rbi +33 -0
  46. data/rbi/typed_cache/instrumenters.rbi +19 -0
  47. data/rbi/typed_cache/maybe.rbi +108 -0
  48. data/rbi/typed_cache/namespace.rbi +30 -0
  49. data/rbi/typed_cache/snapshot.rbi +54 -0
  50. data/rbi/typed_cache/store.rbi +71 -0
  51. data/rbi/typed_cache/version.rbi +5 -0
  52. data/rbi/typed_cache.rbi +49 -0
  53. data/sig/generated/typed_cache/backends/active_support.rbs +14 -2
  54. data/sig/generated/typed_cache/backends/memory.rbs +2 -2
  55. data/sig/generated/typed_cache/backends.rbs +2 -0
  56. data/sig/generated/typed_cache/cache_builder.rbs +13 -2
  57. data/sig/generated/typed_cache/cache_key.rbs +5 -0
  58. data/sig/generated/typed_cache/cache_ref.rbs +4 -4
  59. data/sig/generated/typed_cache/clock.rbs +19 -9
  60. data/sig/generated/typed_cache/decorator.rbs +12 -0
  61. data/sig/generated/typed_cache/decorators/instrumented.rbs +35 -0
  62. data/sig/generated/typed_cache/decorators.rbs +2 -0
  63. data/sig/generated/typed_cache/either.rbs +24 -0
  64. data/sig/generated/typed_cache/errors.rbs +2 -0
  65. data/sig/generated/typed_cache/instrumenter.rbs +31 -0
  66. data/sig/generated/typed_cache/instrumenters/active_support.rbs +20 -0
  67. data/sig/generated/typed_cache/instrumenters/mixins/namespaced_singleton.rbs +36 -0
  68. data/sig/generated/typed_cache/instrumenters/mixins.rbs +8 -0
  69. data/sig/generated/typed_cache/instrumenters/monitor.rbs +19 -0
  70. data/sig/generated/typed_cache/instrumenters/null.rbs +21 -0
  71. data/sig/generated/typed_cache/instrumenters.rbs +26 -0
  72. data/sig/generated/typed_cache/maybe.rbs +20 -0
  73. data/sig/generated/typed_cache/namespace.rbs +24 -3
  74. data/sig/generated/typed_cache/railtie.rbs +6 -0
  75. data/sig/generated/typed_cache/registry.rbs +8 -0
  76. data/sig/generated/typed_cache/snapshot.rbs +12 -6
  77. data/sig/generated/typed_cache/store/instrumented.rbs +2 -6
  78. data/sig/generated/typed_cache/store.rbs +26 -8
  79. data/sig/generated/typed_cache.rbs +8 -6
  80. data/typed_cache.gemspec +5 -4
  81. data.tar.gz.sig +0 -0
  82. metadata +48 -27
  83. metadata.gz.sig +0 -0
  84. data/lib/typed_cache/instrumentation.rb +0 -112
  85. data/lib/typed_cache/store/instrumented.rb +0 -83
  86. data/sig/generated/typed_cache/instrumentation.rbs +0 -30
  87. data/sig/handwritten/gems/zeitwerk/2.7/zeitwerk.rbs +0 -9
@@ -0,0 +1,16 @@
1
+ # typed: strict
2
+
3
+ module TypedCache
4
+ class CacheKey
5
+ sealed!
6
+
7
+ sig { returns(::TypedCache::Namespace) }
8
+ attr_reader :namespace
9
+
10
+ sig { returns(String) }
11
+ attr_reader :key
12
+
13
+ sig { returns(String) }
14
+ def to_s; end
15
+ end
16
+ end
@@ -0,0 +1,56 @@
1
+ # typed: strict
2
+
3
+ module TypedCache
4
+ class CacheRef
5
+ extend T::Generic
6
+
7
+ sealed!
8
+
9
+ RefType = type_member
10
+
11
+ sig { returns(::TypedCache::Either[Error, ::TypedCache::Snapshot[RefType]]) }
12
+ def read; end
13
+
14
+ sig { params(value: RefType).returns(::TypedCache::Either[Error, ::TypedCache::Snapshot[RefType]]) }
15
+ def write(value); end
16
+
17
+ sig { returns(::TypedCache::Either[Error, ::TypedCache::Snapshot[RefType]]) }
18
+ def delete; end
19
+
20
+ sig { params(block: T.proc.params(value: RefType).returns(RefType)).returns(::TypedCache::Either[Error, ::TypedCache::Snapshot[RefType]]) }
21
+ def fetch(&block); end
22
+
23
+ sig { returns(T::Boolean) }
24
+ def present?; end
25
+
26
+ sig { returns(T::Boolean) }
27
+ def empty?; end
28
+
29
+ sig { params(block: T.proc.params(value: RefType).returns(RefType)).returns(::TypedCache::Either[Error, ::TypedCache::Snapshot[RefType]]) }
30
+ def update(&block); end
31
+
32
+ sig { params(default: RefType).returns(RefType) }
33
+ def value_or(default); end
34
+
35
+ sig { returns(::TypedCache::Maybe[RefType]) }
36
+ def value_maybe; end
37
+
38
+ sig { params(block: T.proc.params(value: RefType).returns(RefType)).returns(::TypedCache::Either[Error, ::TypedCache::Snapshot[RefType]]) }
39
+ def compute_if_absent(&block); end
40
+
41
+ sig { params(new_key: String).returns(::TypedCache::CacheRef[RefType]) }
42
+ def with_key(new_key); end
43
+
44
+ sig { params(scope_key: String).returns(::TypedCache::CacheRef[RefType]) }
45
+ def scope(scope_key); end
46
+
47
+ sig { type_parameters(:T).params(left_fn: T.proc.params(value: Error).returns(T.type_parameter(:T)), right_fn: T.proc.params(value: ::TypedCache::Snapshot[RefType]).returns(T.type_parameter(:T))).returns(T.type_parameter(:T)) }
48
+ def fold(left_fn, right_fn); end
49
+
50
+ sig { type_parameters(:T).params(block: T.proc.params(value: ::TypedCache::Snapshot[RefType]).returns(T.type_parameter(:T))).returns(::TypedCache::Either[Error, T.type_parameter(:T)]) }
51
+ def with_snapshot(&block); end
52
+
53
+ sig { type_parameters(:T).params(block: T.proc.params(value: RefType).returns(T.type_parameter(:T))).returns(::TypedCache::Either[Error, T.type_parameter(:T)]) }
54
+ def with(&block); end
55
+ end
56
+ end
@@ -0,0 +1,67 @@
1
+ # typed: strict
2
+
3
+ module TypedCache
4
+ module Decorator
5
+ extend T::Generic
6
+
7
+ include ::TypedCache::Store
8
+
9
+ abstract!
10
+
11
+ CachedType = type_member
12
+
13
+ sig { params(store: ::TypedCache::Store[CachedType]).void }
14
+ def initialize(store); end
15
+
16
+ sig { overridable.returns(::TypedCache::Store[CachedType]) }
17
+ def store; end
18
+
19
+ sig(:final) { params(key: T.any(String, ::TypedCache::CacheKey)).returns(::TypedCache::CacheRef[CachedType]) }
20
+ def ref(key); end
21
+
22
+ sig { overridable.params(key: T.any(String, ::TypedCache::CacheKey)).returns(::TypedCache::Either[Error, ::TypedCache::Snapshot[CachedType]]) }
23
+ def read(key); end
24
+
25
+ sig { overridable.params(key: T.any(String, ::TypedCache::CacheKey), value: CachedType).returns(::TypedCache::Either[Error, ::TypedCache::Snapshot[CachedType]]) }
26
+ def write(key, value); end
27
+
28
+ sig { overridable.params(key: T.any(String, ::TypedCache::CacheKey)).returns(::TypedCache::Either[Error, ::TypedCache::Snapshot[CachedType]]) }
29
+ def delete(key); end
30
+
31
+ sig { overridable.params(key: T.any(String, ::TypedCache::CacheKey)).returns(T::Boolean) }
32
+ def key?(key); end
33
+
34
+ sig { overridable.params(key: T.any(String, ::TypedCache::CacheKey), block: T.proc.params(value: CachedType).returns(CachedType)).returns(::TypedCache::Either[Error, ::TypedCache::Snapshot[CachedType]]) }
35
+ def fetch(key, &block); end
36
+
37
+ sig { overridable.params(keys: T::Array[T.any(String, ::TypedCache::CacheKey)]).returns(::TypedCache::Either[Error, T::Array[::TypedCache::Snapshot[CachedType]]]) }
38
+ def read_all(keys); end
39
+
40
+ sig { overridable.params(keys: T::Array[T.any(String, ::TypedCache::CacheKey)], block: T.proc.params(key: T.any(String, ::TypedCache::CacheKey)).returns(CachedType)).returns(::TypedCache::Either[Error, T::Array[::TypedCache::Snapshot[CachedType]]]) }
41
+ def fetch_all(keys, &block); end
42
+
43
+ sig { overridable.params(values: T::Hash[T.any(String, ::TypedCache::CacheKey), CachedType]).returns(::TypedCache::Either[Error, T::Array[::TypedCache::Snapshot[CachedType]]]) }
44
+ def write_all(values); end
45
+
46
+ sig { overridable.void }
47
+ def clear; end
48
+
49
+ sig(:final) { returns(::TypedCache::Namespace) }
50
+ def namespace; end
51
+
52
+ sig(:final) { params(namespace: ::TypedCache::Namespace).returns(::TypedCache::Store[CachedType]) }
53
+ def with_namespace(namespace); end
54
+
55
+ sig { abstract.returns(String) }
56
+ def store_type; end
57
+
58
+ sig { overridable.params(other: T.self_type).void }
59
+ def initialize_copy(other); end
60
+
61
+ sig(:final) { params(key: T.any(String, ::TypedCache::CacheKey)).returns(::TypedCache::CacheKey) }
62
+ def namespaced_key(key); end
63
+
64
+ sig { overridable.returns(::TypedCache::Instrumenter) }
65
+ def instrumenter; end
66
+ end
67
+ end
@@ -0,0 +1,13 @@
1
+ # typed: strict
2
+
3
+ module TypedCache
4
+ module Decorators
5
+ module Instrumented
6
+ extend T::Generic
7
+
8
+ include ::TypedCache::Decorator
9
+
10
+ CachedType = type_member
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ # typed: strict
2
+
3
+ module TypedCache
4
+ module Decorators
5
+ class << self
6
+ sig { params(name: Symbol, klass: T::Class[::TypedCache::Decorator[T.anything]]).returns(T.self_type) }
7
+ def register(name, klass); end
8
+
9
+ sig { params(name: Symbol, args: T::Array[T.anything], options: T::Hash[Symbol, T.anything]).returns(T.self_type) }
10
+ def resolve(name, *args, **options); end
11
+
12
+ sig { returns(T::Array[T::Class[::TypedCache::Decorator[T.anything]]]) }
13
+ def available; end
14
+
15
+ sig { params(name: Symbol).returns(T::Boolean) }
16
+ def registered?(name); end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,122 @@
1
+ # typed: strict
2
+
3
+ module TypedCache
4
+ module Either
5
+ extend T::Generic
6
+ include Kernel
7
+
8
+ mixes_in_class_methods(T::Generic)
9
+
10
+ sealed!
11
+ interface!
12
+
13
+ L = type_member(:out)
14
+ R = type_member(:out)
15
+
16
+ interface!
17
+
18
+ sig { abstract.returns(T::Boolean) }
19
+ def left?; end
20
+
21
+ sig { abstract.returns(T::Boolean) }
22
+ def right?; end
23
+
24
+ sig { abstract.type_parameters(:T).params(block: T.proc.params(value: R).returns(T.type_parameter(:T))).returns(::TypedCache::Either[L, T.type_parameter(:T)]) }
25
+ def map(&block); end
26
+
27
+ sig { abstract.type_parameters(:T).params(block: T.proc.params(value: L).returns(T.type_parameter(:T))).returns(::TypedCache::Either[T.type_parameter(:T), R]) }
28
+ def map_left(&block); end
29
+
30
+ sig { abstract.type_parameters(:E, :R2).params(block: T.proc.params(value: R).returns(::TypedCache::Either[T.type_parameter(:E), T.type_parameter(:R2)])).returns(::TypedCache::Either[T.type_parameter(:E), T.type_parameter(:R2)]) }
31
+ def bind(&block); end
32
+
33
+ sig { abstract.type_parameters(:T).params(left_block: T.proc.params(value: L).returns(T.type_parameter(:T)), right_block: T.proc.params(value: R).returns(T.type_parameter(:T))).returns(T.type_parameter(:T)) }
34
+ def fold(left_block, right_block); end
35
+
36
+ sig { abstract.params(block: T.proc.params(value: L).void).returns(R) }
37
+ def right_or_else(&block); end
38
+
39
+ sig { abstract.returns(R) }
40
+ def right_or_raise!; end
41
+ end
42
+
43
+ class Left
44
+ sealed!
45
+
46
+ include ::TypedCache::Either
47
+ extend T::Generic
48
+
49
+ L = type_member(:out)
50
+ R = type_member(:out) { { fixed: T.noreturn } }
51
+
52
+ sig { override.returns(TrueClass) }
53
+ def left?; end
54
+
55
+ sig { override.returns(FalseClass) }
56
+ def right?; end
57
+
58
+ sig { override.type_parameters(:T).params(block: T.proc.params(value: R).returns(T.type_parameter(:T))).returns(T.self_type) }
59
+ def map(&block); end
60
+
61
+ sig { override.type_parameters(:T).params(block: T.proc.params(value: L).returns(T.type_parameter(:T))).returns(Left[T.type_parameter(:T)]) }
62
+ def map_left(&block); end
63
+
64
+ sig { override.type_parameters(:E, :R2).params(block: T.proc.params(value: R).returns(::TypedCache::Either[T.type_parameter(:E), T.type_parameter(:R2)])).returns(T.self_type) }
65
+ def bind(&block); end
66
+
67
+ sig { override.type_parameters(:T).params(left_block: T.proc.params(value: L).returns(T.type_parameter(:T)), right_block: T.proc.params(value: R).returns(T.type_parameter(:T))).returns(T.type_parameter(:T)) }
68
+ def fold(left_block, right_block); end
69
+
70
+ sig { returns(L) }
71
+ def value; end
72
+
73
+ sig { returns(L) }
74
+ def error; end
75
+
76
+ sig { params(block: T.proc.params(value: L).void).returns(R) }
77
+ def right_or_else(&block); end
78
+
79
+ sig { returns(T.noreturn) }
80
+ def right_or_raise!; end
81
+ end
82
+
83
+ class Right
84
+ sealed!
85
+
86
+ include ::TypedCache::Either
87
+ extend T::Generic
88
+
89
+ L = type_member(:out) { { fixed: T.noreturn } }
90
+ R = type_member(:out)
91
+
92
+ sig { override.returns(FalseClass) }
93
+ def left?; end
94
+
95
+ sig { override.returns(TrueClass) }
96
+ def right?; end
97
+
98
+ sig { override.type_parameters(:T).params(block: T.proc.params(value: R).returns(T.type_parameter(:T))).returns(Right[T.type_parameter(:T)]) }
99
+ def map(&block); end
100
+
101
+ sig { override.type_parameters(:T).params(block: T.proc.params(value: L).returns(T.type_parameter(:T))).returns(T.self_type) }
102
+ def map_left(&block); end
103
+
104
+ sig { override.type_parameters(:E, :R2).params(block: T.proc.params(value: R).returns(::TypedCache::Either[T.type_parameter(:E), T.type_parameter(:R2)])).returns(::TypedCache::Either[T.type_parameter(:E), T.type_parameter(:R2)]) }
105
+ def bind(&block); end
106
+
107
+ sig { override.type_parameters(:T).params(left_block: T.proc.params(value: L).returns(T.type_parameter(:T)), right_block: T.proc.params(value: R).returns(T.type_parameter(:T))).returns(T.type_parameter(:T)) }
108
+ def fold(left_block, right_block); end
109
+
110
+ sig { returns(R) }
111
+ def value; end
112
+
113
+ sig { returns(R) }
114
+ def result; end
115
+
116
+ sig { params(block: T.proc.params(value: T.anything).void).returns(R) }
117
+ def right_or_else(&block); end
118
+
119
+ sig { returns(R) }
120
+ def right_or_raise!; end
121
+ end
122
+ end
@@ -0,0 +1,20 @@
1
+ # typed: strict
2
+
3
+ module TypedCache
4
+ class Error < StandardError; end
5
+
6
+ class StoreError < ::TypedCache::Error
7
+ sig { params(operation: Symbol, key: ::TypedCache::CacheKey, message: String, original_error: T.nilable(Error)).void }
8
+ def initialize(operation, key, message, original_error = nil); end
9
+ end
10
+
11
+ class TypeError < ::TypedCache::Error
12
+ sig { params(expected_type: String, actual_type: String, value: T.untyped, message: String).void }
13
+ def initialize(expected_type, actual_type, value, message); end
14
+ end
15
+
16
+ class CacheMissError < ::TypedCache::Error
17
+ sig { params(key: ::TypedCache::CacheKey).void }
18
+ def initialize(key); end
19
+ end
20
+ end
@@ -0,0 +1,45 @@
1
+ # typed: strict
2
+
3
+ module TypedCache
4
+ module Instrumenter
5
+ abstract!
6
+
7
+ sig do
8
+ abstract.type_parameters(:R)
9
+ .params(
10
+ event_name: String,
11
+ key: String,
12
+ payload: T::Hash[Symbol, T.untyped],
13
+ blk: T.proc.returns(T.type_parameter(:R)),
14
+ ).returns(T.type_parameter(:R))
15
+ end
16
+ def instrument(event_name, key, **payload, &blk); end
17
+
18
+ sig do
19
+ abstract.type_parameters(:R)
20
+ .params(
21
+ event_name: String,
22
+ filters: T::Hash[Symbol, T.untyped],
23
+ blk: T.proc.void,
24
+ ).returns(T.type_parameter(:R))
25
+ end
26
+ def subscribe(event_name, **filters, &blk); end
27
+
28
+ sig { overridable.returns(String) }
29
+ def namespace; end
30
+
31
+ sig { overridable.returns(T::Boolean) }
32
+ def enabled?; end
33
+
34
+ private
35
+
36
+ sig { overridable.params(operation: String, key: String, payload: T::Hash[Symbol, T.untyped]).returns(T::Hash[Symbol, T.untyped]) }
37
+ def build_payload(operation, key, **payload); end
38
+
39
+ sig(:final) { params(operation: String).returns(String) }
40
+ def event_name(operation); end
41
+
42
+ sig(:final) { returns(::TypedCache::Private::Configuration::Instrumentation) }
43
+ def config; end
44
+ end
45
+ end
@@ -0,0 +1,33 @@
1
+ # typed: strict
2
+
3
+ module TypedCache
4
+ module Instrumenters
5
+ module Mixins
6
+ module NamedspacedSingleton
7
+ requires_ancestor { ::TypedCache::Instrumenter }
8
+
9
+ class << self
10
+ sig { returns(T::Array[T::Class[T.all(::TypedCache::Instrumenter, ::TypedCache::Instrumenters::Mixins::NamedspacedSingleton)]]) }
11
+ def all; end
12
+ end
13
+
14
+ sig { params(namespace: ::TypedCache::Namespace).void }
15
+ def initialize(namespace); end
16
+
17
+ sig { returns(::TypedCache::Namespace) }
18
+ def namespace; end
19
+
20
+ module ClassMethods
21
+ sig { params(namespace: ::TypedCache::Namespace).returns(T::Class[T.all(::TypedCache::Instrumenter, ::TypedCache::Instrumenters::Mixins::NamedspacedSingleton)]) }
22
+ def new(namespace: T.unsafe(nil)); end
23
+
24
+ sig { params(namespace: ::TypedCache::Namespace).returns(T::Class[T.all(::TypedCache::Instrumenter, ::TypedCache::Instrumenters::Mixins::NamedspacedSingleton)]) }
25
+ def get(namespace); end
26
+
27
+ sig { void }
28
+ def clear_namespace_cache; end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,19 @@
1
+ # typed: strict
2
+
3
+ module TypedCache
4
+ module Instrumenters
5
+ class << self
6
+ sig { params(name: Symbol, klass: T::Class[::TypedCache::Instrumenter]).returns(T.self_type) }
7
+ def register(name, klass); end
8
+
9
+ sig { params(name: Symbol, args: T::Array[T.anything], options: T::Hash[Symbol, T.anything]).returns(T.self_type) }
10
+ def resolve(name, *args, **options); end
11
+
12
+ sig { returns(T::Array[T::Class[::TypedCache::Instrumenter]]) }
13
+ def available; end
14
+
15
+ sig { params(name: Symbol).returns(T::Boolean) }
16
+ def registered?(name); end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,108 @@
1
+ # typed: strict
2
+
3
+ module TypedCache
4
+ module Maybe
5
+ include Kernel
6
+ extend T::Generic
7
+
8
+ mixes_in_class_methods(T::Generic)
9
+
10
+ sealed!
11
+ interface!
12
+
13
+ V = type_member(:out)
14
+
15
+ sig { abstract.returns(T::Boolean) }
16
+ def some?; end
17
+
18
+ sig { abstract.returns(T::Boolean) }
19
+ def nothing?; end
20
+
21
+ sig { abstract.type_parameters(:T).params(block: T.proc.params(value: V).returns(T.type_parameter(:T))).returns(::TypedCache::Maybe[T.type_parameter(:T)]) }
22
+ def map(&block); end
23
+
24
+ sig { abstract.type_parameters(:T).params(block: T.proc.params(value: V).returns(::TypedCache::Maybe[T.type_parameter(:T)])).returns(::TypedCache::Maybe[T.type_parameter(:T)]) }
25
+ def bind(&block); end
26
+
27
+ alias flat_map bind
28
+
29
+ sig { abstract.type_parameters(:T).params(block: T.proc.returns(T.type_parameter(:T))).returns(T.any(T.type_parameter(:T), V)) }
30
+ def value_or_else(&block); end
31
+
32
+ sig { abstract.type_parameters(:T).params(value: T.type_parameter(:T)).returns(T.any(T.type_parameter(:T), V)) }
33
+ def value_or(value); end
34
+
35
+ sig { abstract.returns(V) }
36
+ def value_or_raise!; end
37
+
38
+ class << self
39
+ sig { type_parameters(:T).params(value: T.type_parameter(:T)).returns(::TypedCache::Some[T.type_parameter(:T)]) }
40
+ def some(value); end
41
+
42
+ sig { returns(::TypedCache::Nothing) }
43
+ def none; end
44
+
45
+ sig { params(value: NilClass).returns(::TypedCache::Nothing) }
46
+ sig { params(value: ::TypedCache::Nothing).returns(::TypedCache::Nothing) }
47
+ sig { type_parameters(:T).params(value: ::TypedCache::Some[T.type_parameter(:T)]).returns(::TypedCache::Some[T.type_parameter(:T)]) }
48
+ sig { type_parameters(:T).params(value: T.type_parameter(:T)).returns(::TypedCache::Some[T.type_parameter(:T)]) }
49
+ def wrap(value); end
50
+
51
+ alias [] some
52
+ end
53
+ end
54
+
55
+ class Some
56
+ sealed!
57
+
58
+ include ::TypedCache::Maybe
59
+ extend T::Generic
60
+
61
+ V = type_member(:out)
62
+
63
+ sig { override.returns(TrueClass) }
64
+ def some?; end
65
+
66
+ sig { override.returns(FalseClass) }
67
+ def nothing?; end
68
+
69
+ sig { override.type_parameters(:T).params(block: T.proc.params(value: V).returns(T.type_parameter(:T))).returns(Some[T.type_parameter(:T)]) }
70
+ def map(&block); end
71
+
72
+ sig { override.type_parameters(:T).params(block: T.proc.params(value: V).returns(::TypedCache::Maybe[T.type_parameter(:T)])).returns(::TypedCache::Maybe[T.type_parameter(:T)]) }
73
+ def bind(&block); end
74
+
75
+ sig { override.type_parameters(:T).params(value: T.type_parameter(:T)).returns(V) }
76
+ def value_or(value); end
77
+
78
+ sig { override.returns(V) }
79
+ def value_or_raise!; end
80
+ end
81
+
82
+ class Nothing
83
+ sealed!
84
+
85
+ include ::TypedCache::Maybe
86
+ extend T::Generic
87
+
88
+ V = type_member(:out) { { fixed: T.noreturn } }
89
+
90
+ sig { override.returns(FalseClass) }
91
+ def some?; end
92
+
93
+ sig { override.returns(TrueClass) }
94
+ def nothing?; end
95
+
96
+ sig { override.type_parameters(:T).params(block: T.proc.params(value: V).returns(T.type_parameter(:T))).returns(T.self_type) }
97
+ def map(&block); end
98
+
99
+ sig { override.type_parameters(:T).params(block: T.proc.params(value: V).returns(::TypedCache::Maybe[T.type_parameter(:T)])).returns(T.self_type) }
100
+ def bind(&block); end
101
+
102
+ sig { override.type_parameters(:T).params(value: T.type_parameter(:T)).returns(T.type_parameter(:T)) }
103
+ def value_or(value); end
104
+
105
+ sig { override.returns(T.noreturn) }
106
+ def value_or_raise!; end
107
+ end
108
+ end
@@ -0,0 +1,30 @@
1
+ # typed: strict
2
+
3
+ module TypedCache
4
+ class Namespace
5
+ sealed!
6
+
7
+ class << self
8
+ sig { returns(T.attached_class) }
9
+ def root; end
10
+
11
+ sig { params(namespace: String, namespaces: String).returns(T.attached_class) }
12
+ def at(namespace, *namespaces); end
13
+ end
14
+
15
+ sig { params(namespace: String, key_factory: T.nilable(T.proc.params(namespace: ::TypedCache::Namespace, key: String).returns(::TypedCache::CacheKey))).returns(::TypedCache::Namespace) }
16
+ def nested(namespace, &key_factory); end
17
+
18
+ sig { params(namespaces: String, key_factory: T.nilable(T.proc.params(namespace: ::TypedCache::Namespace, key: String).returns(::TypedCache::CacheKey))).returns(::TypedCache::Namespace) }
19
+ def join(*namespaces, &key_factory); end
20
+
21
+ sig { returns(::TypedCache::Namespace) }
22
+ def parent_namespace; end
23
+
24
+ sig { params(key: String).returns(::TypedCache::CacheKey) }
25
+ def key(key); end
26
+
27
+ sig { returns(String) }
28
+ def to_s; end
29
+ end
30
+ end
@@ -0,0 +1,54 @@
1
+ # typed: strict
2
+
3
+ module TypedCache
4
+ class Snapshot
5
+ extend T::Generic
6
+
7
+ sealed!
8
+
9
+ ValueType = type_member(:out)
10
+
11
+ sig { returns(::TypedCache::CacheKey) }
12
+ def key; end
13
+
14
+ sig { returns(ValueType) }
15
+ def value; end
16
+
17
+ sig { returns(Time) }
18
+ def retrieved_at; end
19
+
20
+ sig { returns(Symbol) }
21
+ def source; end
22
+
23
+ sig { returns(Float) }
24
+ def age; end
25
+
26
+ sig { returns(T::Boolean) }
27
+ def from_cache?; end
28
+
29
+ sig { returns(T::Boolean) }
30
+ def computed?; end
31
+
32
+ sig { returns(T::Boolean) }
33
+ def updated?; end
34
+
35
+ sig { type_parameters(:T).params(block: T.proc.params(value: ValueType).returns(T.type_parameter(:T))).returns(::TypedCache::Snapshot[T.type_parameter(:T)]) }
36
+ def map(&block); end
37
+
38
+ sig { type_parameters(:T).params(block: T.proc.params(value: ValueType).returns(::TypedCache::Either[Error, T.type_parameter(:T)])).returns(::TypedCache::Either[Error, ::TypedCache::Snapshot[T.type_parameter(:T)]]) }
39
+ def bind(&block); end
40
+
41
+ alias flat_map bind
42
+
43
+ class << self
44
+ sig { type_parameters(:T).params(key: ::TypedCache::CacheKey, value: T.type_parameter(:T)).returns(::TypedCache::Snapshot[T.type_parameter(:T)]) }
45
+ def cached(key, value); end
46
+
47
+ sig { type_parameters(:T).params(key: ::TypedCache::CacheKey, value: T.type_parameter(:T)).returns(::TypedCache::Snapshot[T.type_parameter(:T)]) }
48
+ def computed(key, value); end
49
+
50
+ sig { type_parameters(:T).params(key: ::TypedCache::CacheKey, value: T.type_parameter(:T)).returns(::TypedCache::Snapshot[T.type_parameter(:T)]) }
51
+ def updated(key, value); end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,71 @@
1
+ # typed: strict
2
+
3
+ module TypedCache
4
+ module Store
5
+ extend T::Generic
6
+
7
+ abstract!
8
+
9
+ CachedType = type_member
10
+
11
+ Error = T.type_alias { TypedCache::Error }
12
+ Key = T.type_alias { T.any(String, ::TypedCache::CacheKey) }
13
+ private_constant :Error, :Key
14
+
15
+ sig { params(key: Key).returns(::TypedCache::Either[Error, CachedType]) }
16
+ def read(key); end
17
+
18
+ sig { params(keys: T::Array[Key]).returns(::TypedCache::Either[Error, T::Array[::TypedCache::Snapshot[CachedType]]]) }
19
+ def read_all(keys); end
20
+
21
+ sig { params(key: Key, value: CachedType).returns(::TypedCache::Either[Error, ::TypedCache::Snapshot[CachedType]]) }
22
+ def write(key, value); end
23
+
24
+ sig { params(values: T::Hash[Key, CachedType]).returns(::TypedCache::Either[Error, T::Array[::TypedCache::Snapshot[CachedType]]]) }
25
+ def write_all(values); end
26
+
27
+ sig { params(key: Key).returns(::TypedCache::Either[Error, ::TypedCache::Snapshot[CachedType]]) }
28
+ def delete(key); end
29
+
30
+ sig { params(key: Key).returns(::TypedCache::CacheRef[CachedType]) }
31
+ def ref(key); end
32
+
33
+ sig { void }
34
+ def clear; end
35
+
36
+ sig { params(key: Key).returns(T::Boolean) }
37
+ def key?(key); end
38
+
39
+ sig { params(key: Key, block: T.proc.returns(T.nilable(CachedType))).returns(::TypedCache::Either[Error, ::TypedCache::Snapshot[::TypedCache::Maybe[CachedType]]]) }
40
+ def fetch(key, &block); end
41
+
42
+ sig { params(keys: T::Array[Key], block: T.proc.params(key: ::TypedCache::CacheKey).returns(T.nilable(CachedType))).returns(::TypedCache::Either[Error, T::Array[::TypedCache::Snapshot[CachedType]]]) }
43
+ def fetch_all(keys, &block); end
44
+
45
+ sig { returns(::TypedCache::Namespace) }
46
+ def namespace; end
47
+
48
+ sig { params(ns: T.any(::TypedCache::Namespace, String, T::Array[String])).returns(::TypedCache::Store[CachedType]) }
49
+ def with_namespace(ns); end
50
+
51
+ sig { returns(String) }
52
+ def store_type; end
53
+
54
+ sig { returns(T.self_type) }
55
+ def clone; end
56
+
57
+ sig { params(key: Key).returns(::TypedCache::CacheKey) }
58
+ def namespaced_key(key); end
59
+
60
+ sig { returns(::TypedCache::Instrumenter) }
61
+ def instrumenter; end
62
+
63
+ protected
64
+
65
+ sig { params(string: String).returns(String) }
66
+ def snake_case(string); end
67
+
68
+ sig { params(namespace: ::TypedCache::Namespace).returns(::TypedCache::Namespace) }
69
+ def nested_namespace(namespace); end
70
+ end
71
+ end
@@ -0,0 +1,5 @@
1
+ # typed: strict
2
+
3
+ module TypedCache
4
+ VERSION = T.let(T.unsafe(nil), String)
5
+ end