Libraryless. Click here for Pure Java version (6332L/36K).
1 | sclass SerializeComputations<A, B> {
|
2 | Map<A, Var<OKOrError<B>>> calculating = syncMap(); |
3 | new MultiSetMap<A, Thread> waitingFor; |
4 | |
5 | B get(A a, IF1<A, B> f) {
|
6 | ret get(a, () -> f.get(a)); |
7 | } |
8 | |
9 | B get(A a, IF0<B> f) {
|
10 | bool meCalc; |
11 | Var<OKOrError<B>> var; |
12 | synchronized {
|
13 | var = calculating.get(a); |
14 | meCalc = var == null; |
15 | |
16 | if (meCalc) {
|
17 | var = new Var; |
18 | calculating.put(a, var); |
19 | } else |
20 | waitingFor.put(a, currentThread()); |
21 | } |
22 | |
23 | if (meCalc) {
|
24 | OKOrError<B> b = okOrError(() -> f!); |
25 | var.set(b); |
26 | ret b.getMandatory(); |
27 | } else {
|
28 | try {
|
29 | waitUntilNotNull(var); |
30 | ret var->getMandatory(); |
31 | } finally {
|
32 | synchronized {
|
33 | waitingFor.remove(a, currentThread()); |
34 | if (!waitingFor.containsKey(a)) |
35 | calculating.remove(a); |
36 | } |
37 | } |
38 | } |
39 | } |
40 | } |
Began life as a copy of #1032122
download show line numbers debug dex old transpilations
Travelled to 4 computer(s): bhatertpkbcr, ekrmjmnbrukm, mqqgnosmbjvj, pyentgdyhuwx
No comments. add comment
| Snippet ID: | #1032124 |
| Snippet name: | SerializeComputations |
| Eternal ID of this version: | #1032124/11 |
| Text MD5: | dc0dfda23739f460c10dc6f43fd0c864 |
| Transpilation MD5: | 01c17d6a75ebecebb251938a01470071 |
| Author: | stefan |
| Category: | javax / multi-threading |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2021-11-01 23:22:20 |
| Source code size: | 930 bytes / 40 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 421 / 684 |
| Version history: | 10 change(s) |
| Referenced in: | [show references] |