Skip to content

Commit 524a743

Browse files
flarnieacdlite
authored andcommitted
Fix for Flow issues in SimpleCacheProvider (facebook#12942)
* Fix for Flow issues in SimpleCacheProvider **what is the change?:** - Fixed some flow errors which were somehow swallowed when CI originally - Loosen flow types to avoid issue with recursive loop in Flow; facebook/flow#5870 **why make this change?:** To unbreak master and unblock other changes we want to make. **test plan:** Flow passes! **issue:** facebook#12941 * Fix lints
1 parent ae57b12 commit 524a743

File tree

1 file changed

+42
-21
lines changed

1 file changed

+42
-21
lines changed

packages/simple-cache-provider/src/SimpleCacheProvider.js

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,34 @@ const Pending = 1;
1717
const Resolved = 2;
1818
const Rejected = 3;
1919

20-
type EmptyRecord<K, V> = {|
20+
type EmptyRecord<K> = {|
2121
status: 0,
2222
suspender: null,
2323
key: K,
2424
value: null,
2525
error: null,
26-
next: Record<K, V> | null,
27-
previous: Record<K, V> | null,
26+
next: any, // TODO: (issue #12941)
27+
previous: any, // TODO: (issue #12941)
28+
/**
29+
* Proper types would be something like this:
30+
* next: Record<K, V> | null,
31+
* previous: Record<K, V> | null,
32+
*/
2833
|};
2934

3035
type PendingRecord<K, V> = {|
3136
status: 1,
32-
suspender: Promise<K, V>,
37+
suspender: Promise<V>,
3338
key: K,
3439
value: null,
3540
error: null,
36-
next: Record<K, V> | null,
37-
previous: Record<K, V> | null,
41+
next: any, // TODO: (issue #12941)
42+
previous: any, // TODO: (issue #12941)
43+
/**
44+
* Proper types would be something like this:
45+
* next: Record<K, V> | null,
46+
* previous: Record<K, V> | null,
47+
*/
3848
|};
3949

4050
type ResolvedRecord<K, V> = {|
@@ -43,30 +53,41 @@ type ResolvedRecord<K, V> = {|
4353
key: K,
4454
value: V,
4555
error: null,
46-
next: Record<K, V> | null,
47-
previous: Record<K, V> | null,
56+
next: any, // TODO: (issue #12941)
57+
previous: any, // TODO: (issue #12941)
58+
/**
59+
* Proper types would be something like this:
60+
* next: Record<K, V> | null,
61+
* previous: Record<K, V> | null,
62+
*/
4863
|};
4964

50-
type RejectedRecord<K, V> = {|
65+
type RejectedRecord<K> = {|
5166
status: 3,
5267
suspender: null,
5368
key: K,
5469
value: null,
5570
error: Error,
56-
next: Record<K, V> | null,
57-
previous: Record<K, V> | null,
71+
next: any, // TODO: (issue #12941)
72+
previous: any, // TODO: (issue #12941)
73+
/**
74+
* Proper types would be something like this:
75+
* next: Record<K, V> | null,
76+
* previous: Record<K, V> | null,
77+
*/
5878
|};
5979

6080
type Record<K, V> =
61-
| EmptyRecord<K, V>
81+
| EmptyRecord<K>
6282
| PendingRecord<K, V>
6383
| ResolvedRecord<K, V>
64-
| RejectedRecord<K, V>;
84+
| RejectedRecord<K>;
6585

6686
type RecordCache<K, V> = {|
6787
map: Map<K, Record<K, V>>,
6888
head: Record<K, V> | null,
6989
tail: Record<K, V> | null,
90+
size: number,
7091
|};
7192

7293
// TODO: How do you express this type with Flow?
@@ -107,7 +128,7 @@ if (__DEV__) {
107128
const MAX_SIZE = 500;
108129
const PAGE_SIZE = 50;
109130

110-
function createRecord<K, V>(key: K): EmptyRecord<K, V> {
131+
function createRecord<K>(key: K): EmptyRecord<K> {
111132
return {
112133
status: Empty,
113134
suspender: null,
@@ -131,7 +152,7 @@ function createRecordCache<K, V>(): RecordCache<K, V> {
131152
export function createCache(invalidator: () => mixed): Cache {
132153
const resourceMap: ResourceMap = new Map();
133154

134-
function accessRecord<K, V>(resourceType: any, key: K): Record<V> {
155+
function accessRecord<K, V>(resourceType: any, key: K): Record<K, V> {
135156
if (__DEV__) {
136157
warning(
137158
typeof resourceType !== 'string' && typeof resourceType !== 'number',
@@ -206,22 +227,22 @@ export function createCache(invalidator: () => mixed): Cache {
206227
return newHead;
207228
}
208229

209-
function load<V>(emptyRecord: EmptyRecord, suspender: Promise<V>) {
210-
const pendingRecord: PendingRecord<V> = (emptyRecord: any);
230+
function load<K, V>(emptyRecord: EmptyRecord<K>, suspender: Promise<V>) {
231+
const pendingRecord: PendingRecord<K, V> = (emptyRecord: any);
211232
pendingRecord.status = Pending;
212233
pendingRecord.suspender = suspender;
213234
suspender.then(
214235
value => {
215236
// Resource loaded successfully.
216-
const resolvedRecord: ResolvedRecord<V> = (pendingRecord: any);
237+
const resolvedRecord: ResolvedRecord<K, V> = (pendingRecord: any);
217238
resolvedRecord.status = Resolved;
218239
resolvedRecord.suspender = null;
219240
resolvedRecord.value = value;
220241
},
221242
error => {
222243
// Resource failed to load. Stash the error for later so we can throw it
223244
// the next time it's requested.
224-
const rejectedRecord: RejectedRecord = (pendingRecord: any);
245+
const rejectedRecord: RejectedRecord<K> = (pendingRecord: any);
225246
rejectedRecord.status = Rejected;
226247
rejectedRecord.suspender = null;
227248
rejectedRecord.error = error;
@@ -239,7 +260,7 @@ export function createCache(invalidator: () => mixed): Cache {
239260
miss: A => Promise<V>,
240261
missArg: A,
241262
): void {
242-
const record: Record<V> = accessRecord(resourceType, key);
263+
const record: Record<K, V> = accessRecord(resourceType, key);
243264
switch (record.status) {
244265
case Empty:
245266
// Warm the cache.
@@ -263,7 +284,7 @@ export function createCache(invalidator: () => mixed): Cache {
263284
miss: A => Promise<V>,
264285
missArg: A,
265286
): V {
266-
const record: Record<V> = accessRecord(resourceType, key);
287+
const record: Record<K, V> = accessRecord(resourceType, key);
267288
switch (record.status) {
268289
case Empty:
269290
// Load the requested resource.

0 commit comments

Comments
 (0)