1 | sclass BStack > VStack { |
2 | static int idCounter; |
3 | int stackID = ++idCounter; |
4 | |
5 | // alternative to backtrack to |
6 | IF0<BStack> alternative; |
7 | |
8 | // steps to undo before switching to the alternative |
9 | L<AutoCloseable> undos; |
10 | |
11 | *() {} |
12 | *(Computable computation) { push(computation); } |
13 | *(Iterable<Computable> l) { pushAll(l); } |
14 | |
15 | BStack cloneStack() { |
16 | new BStack s; |
17 | s.stack = shallowCloneElements(stack); |
18 | ret s; |
19 | } |
20 | |
21 | void addUndo(AutoCloseable undo) { |
22 | if (undo == null) ret; |
23 | if (undos == null) undos = new L; |
24 | undos.add(undo); |
25 | } |
26 | |
27 | <A extends VStack.Computable> void options(A function, |
28 | IVF1<A>... options) { |
29 | // Check if there is more than one option |
30 | if (l(options) > 1) { |
31 | // Then remember this option in a cloned stack |
32 | IVF1<A> option2 = second(options); |
33 | addAlternative(clonedStack -> { |
34 | A clonedFunction = (A) last(clonedStack.stack); |
35 | option2.get(clonedFunction); |
36 | }); |
37 | } |
38 | |
39 | // Execute the first option |
40 | first(options).get(function); |
41 | } |
42 | |
43 | void addAlternative(IVF1<BStack> action) { |
44 | BStack clonedStack = cloneStack(); |
45 | alternative = -> { |
46 | action.get(clonedStack); |
47 | ret clonedStack; |
48 | }; |
49 | } |
50 | |
51 | // Try to backtrack one step and return a new stack |
52 | // Returns null if no backtracking possible |
53 | BStack backtrack() ctex { |
54 | if (undos != null) |
55 | for (undo : reversed(getAndClearList(undos))) |
56 | undo.close(); |
57 | |
58 | ret alternative?!; |
59 | } |
60 | |
61 | Object nextResult() { |
62 | stepAll(this); |
63 | return latestResult; |
64 | } |
65 | |
66 | // calculate next result and print stack at every step |
67 | Object nextResultWithPrintStruct() { |
68 | stepAllWithPrintStruct(this); |
69 | return latestResult; |
70 | } |
71 | } |
Began life as a copy of #1035381
download show line numbers debug dex old transpilations
Travelled to 2 computer(s): mowyntqkapby, mqqgnosmbjvj
No comments. add comment
Snippet ID: | #1035383 |
Snippet name: | BStack backup |
Eternal ID of this version: | #1035383/1 |
Text MD5: | 0f0cf60c645f3bf3b7fddcdcb1ffea9f |
Author: | stefan |
Category: | javax |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2022-05-04 19:26:33 |
Source code size: | 1782 bytes / 71 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 112 / 129 |
Referenced in: | [show references] |