Libraryless. Click here for Pure Java version (12253L/71K).
1 | srecord noeq FollowTickerFile(File tickerFile) is AutoCloseable {
|
2 | settable int historyEntriesToGrab; |
3 | settable int interval = 250; |
4 | |
5 | settable ISleeper sleeper = defaultSleeper(); |
6 | |
7 | // internal, may change |
8 | TailFile tailFile; |
9 | |
10 | event historicLine(S line); |
11 | event liveLine(S line); |
12 | |
13 | gettable volatile long liveTimestamp; |
14 | gettable volatile S lastLiveLine; |
15 | |
16 | settable transient bool started; |
17 | event fireStarted; |
18 | |
19 | settable int maxLineLengthForTickerEntry = 200; |
20 | |
21 | settable Q q = startQ(); |
22 | |
23 | bool isLive() { ret liveTimestamp != 0; }
|
24 | |
25 | void start {
|
26 | q.add(r {
|
27 | if (started()) ret; |
28 | started(true); |
29 | fireStarted(); |
30 | |
31 | onLiveLine(line -> {
|
32 | lastLiveLine = line; |
33 | liveTimestamp = now(); |
34 | }); |
35 | |
36 | long fileSize = l(tickerFile); |
37 | long start = max(0, fileSize-maxLineLengthForTickerEntry*historyEntriesToGrab); |
38 | if (historyEntriesToGrab > 0) {
|
39 | S text = loadTextFilePart(tickerFile, start, fileSize); |
40 | LS lastTickerLines = takeLast(historyEntriesToGrab, lines(text)); |
41 | |
42 | print("Have historic lines: " + l(lastTickerLines) + "/" + historyEntriesToGrab);
|
43 | for (line : lastTickerLines) |
44 | historicLine(line); |
45 | } |
46 | |
47 | makeTailFile(fileSize); |
48 | }); |
49 | } |
50 | |
51 | void makeTailFile(long fileSize) {
|
52 | started(true); |
53 | print("Following " + tickerFile + " (" + n2(l(tickerFile)) + " bytes) from position " + n2(fileSize));
|
54 | tailFile = tailFileLinewiseFromPosition(tickerFile, interval, fileSize, l1 liveLine, sleeper); |
55 | } |
56 | |
57 | close {
|
58 | started(false); |
59 | if (tailFile != null) {
|
60 | print("Done " + tailFile);
|
61 | dispose tailFile; |
62 | } |
63 | } |
64 | |
65 | void switchToFile(File newFile) {
|
66 | if (eq(tickerFile, newFile)) ret; |
67 | q.add(r {
|
68 | if (eq(tickerFile, newFile)) ret; |
69 | print("Switching to ticker file: " + newFile);
|
70 | if (started()) {
|
71 | close(); |
72 | tickerFile = newFile; |
73 | started(true); |
74 | makeTailFile(0); |
75 | } else |
76 | tickerFile = newFile; |
77 | }); |
78 | } |
79 | |
80 | selfType onLine(IVF1<S> l) {
|
81 | onHistoricLine(l); |
82 | ret onLiveLine(l); |
83 | } |
84 | |
85 | toString {
|
86 | ret commaCombine( |
87 | "FollowTickerFile", |
88 | stringIf(started(), "started"), |
89 | !isLive() ? null : "Last live line at " + formatLocalDateWithSeconds(liveTimestamp), |
90 | tickerFile |
91 | ); |
92 | } |
93 | } |
download show line numbers debug dex old transpilations
Travelled to 2 computer(s): elmgxqgtpvxh, mqqgnosmbjvj
No comments. add comment
| Snippet ID: | #1036215 |
| Snippet name: | FollowTickerFile |
| Eternal ID of this version: | #1036215/27 |
| Text MD5: | 923ab1f0cae689c5d2e2a6d4143535a4 |
| Transpilation MD5: | 810ffa54bd08016276fe0682cbbdb27e |
| Author: | stefan |
| Category: | javax / trading |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2023-01-17 20:11:39 |
| Source code size: | 2436 bytes / 93 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 689 / 927 |
| Version history: | 26 change(s) |
| Referenced in: | [show references] |