Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

65
LINES

< > BotCompany Repo | #1024883 // SeenAndQueue

JavaX fragment (include) [tags: use-pretranspiled]

Libraryless. Click here for Pure Java version (3834L/24K).

1  
// synchronized
2  
sclass SeenAndQueue<A> implements Iterable<A> {
3  
  Set<A> seen = syncSet();
4  
  L<A> queue = syncLinkedList();
5  
  Int max; // stop after this many elements if not null
6  
  
7  
  transient L onAddedToQueue = syncList(); // L<Runnable|voidfunc(A)>
8  
  transient L<Runnable> onQueueEmpty = syncList();
9  
10  
  // queue handler  
11  
  transient ReliableSingleThread rst;
12  
  
13  
  *() {}
14  
  *(Runnable handler) { rst(handler); }
15  
  
16  
  bool add(A a) {
17  
    if (a == null || maxReached() || !seen.add(a)) false;
18  
    queue.add(a);
19  
    pcallFAll(onAddedToQueue, a);
20  
    true;
21  
  }
22  
  
23  
  void addAll(Iterable<A> l) { fOr (A a : l) add(a); }
24  
  
25  
  A popQueue() {
26  
    ping();
27  
    synchronized(queue) {
28  
      A a = syncPopFirst(queue);
29  
      if (a != null && empty(queue))
30  
        pcallFAll(onQueueEmpty);
31  
      ret a;
32  
    }
33  
  }
34  
  
35  
  // ends when queue is empty
36  
  ItIt<A> queueIterator() {
37  
    ret iteratorFromFunction_if0(() -> popQueue());
38  
  }
39  
  
40  
  public ItIt<A> iterator() { ret queueIterator(); }
41  
  
42  
  void onAddedToQueue(O r) { onAddedToQueue.add(r); }
43  
  
44  
  ReliableSingleThread rst(Runnable handler) {
45  
    if (rst != null) fail("rst already set");
46  
    rst = ReliableSingleThread(handler);
47  
    onAddedToQueue.add(rst);
48  
    ret rst;
49  
  }
50  
  
51  
  void cleanMeUp {
52  
    cleanUp(rst);
53  
    rst = null;
54  
  }
55  
  
56  
  bool queueEmpty() { ret queue.isEmpty(); }
57  
  bool idle() { ret queueEmpty() && !rstRunning(rst); }
58  
  
59  
  S stats() { ret l(seen) + " seen, " + l(queue) + " queued"
60  
    + (max == null ? "" : ", max: " + max); }
61  
  
62  
  bool maxReached() { ret max != null && l(seen) + l(queue) >= max; }
63  
  
64  
  Set<A> asSet() { ret seen; }
65  
}

download  show line numbers  debug dex  old transpilations   

Travelled to 7 computer(s): bhatertpkbcr, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tvejysmllsmz, vouqrxazstgt, xrpafgyirdlv

No comments. add comment

Snippet ID: #1024883
Snippet name: SeenAndQueue
Eternal ID of this version: #1024883/20
Text MD5: 0d866036f99412a5839830d88c377d28
Transpilation MD5: 95e2c758f00a8475de106d803343891b
Author: stefan
Category: javax
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2020-07-23 17:16:39
Source code size: 1662 bytes / 65 lines
Pitched / IR pitched: No / No
Views / Downloads: 213 / 690
Version history: 19 change(s)
Referenced in: [show references]