small refinements, still flaky
This commit is contained in:
		@@ -12,12 +12,14 @@ public abstract class DigitBlockChecker extends SubmissionPublisher<Boolean> imp
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	int currentRow;
 | 
						int currentRow;
 | 
				
			||||||
	int currentColumn;
 | 
						int currentColumn;
 | 
				
			||||||
 | 
						Flow.Subscription subscription;
 | 
				
			||||||
	Collection<String> digitsProcessed;
 | 
						Collection<String> digitsProcessed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
	public void onSubscribe(Flow.Subscription subscription) {
 | 
						public void onSubscribe(Flow.Subscription subscription) {
 | 
				
			||||||
		currentRow = 1;
 | 
							currentRow = 1;
 | 
				
			||||||
		currentColumn = 0;
 | 
							currentColumn = 0;
 | 
				
			||||||
 | 
							this.subscription = subscription;
 | 
				
			||||||
		digitsProcessed = new HashSet<>();
 | 
							digitsProcessed = new HashSet<>();
 | 
				
			||||||
		subscription.request(9*9);
 | 
							subscription.request(9*9);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -32,12 +34,12 @@ public abstract class DigitBlockChecker extends SubmissionPublisher<Boolean> imp
 | 
				
			|||||||
		if (currentDigitApplies(currentRow, currentColumn)) {
 | 
							if (currentDigitApplies(currentRow, currentColumn)) {
 | 
				
			||||||
			if (digitsProcessed.contains(digit)) {
 | 
								if (digitsProcessed.contains(digit)) {
 | 
				
			||||||
				submit(false);
 | 
									submit(false);
 | 
				
			||||||
				close();
 | 
									subscription.cancel();
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			digitsProcessed.add(digit);
 | 
								digitsProcessed.add(digit);
 | 
				
			||||||
			if (digitsProcessed.size() == 9) {
 | 
								if (digitsProcessed.size() == 9) {
 | 
				
			||||||
				submit(true);
 | 
									submit(true);
 | 
				
			||||||
				close();
 | 
									subscription.cancel();
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -47,7 +49,7 @@ public abstract class DigitBlockChecker extends SubmissionPublisher<Boolean> imp
 | 
				
			|||||||
	@Override
 | 
						@Override
 | 
				
			||||||
	public void onError(Throwable throwable) {
 | 
						public void onError(Throwable throwable) {
 | 
				
			||||||
		System.err.println(throwable.fillInStackTrace());
 | 
							System.err.println(throwable.fillInStackTrace());
 | 
				
			||||||
		close();
 | 
							closeExceptionally(throwable);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,12 +20,12 @@ public class SudokuVerifier implements Flow.Subscriber<Boolean> {
 | 
				
			|||||||
		digitPublisher = new SubmissionPublisher<>();
 | 
							digitPublisher = new SubmissionPublisher<>();
 | 
				
			||||||
		// Setup row and column checking subscribers
 | 
							// Setup row and column checking subscribers
 | 
				
			||||||
		IntStream.rangeClosed(1, 9).boxed()
 | 
							IntStream.rangeClosed(1, 9).boxed()
 | 
				
			||||||
			.forEach(i -> rowCheckerAndColumnChecker(digitPublisher, i));
 | 
								.forEach(i -> rowCheckerAndColumnChecker(i));
 | 
				
			||||||
		// Setup square checking subscribers
 | 
							// Setup square checking subscribers
 | 
				
			||||||
		IntStream.rangeClosed(1, 3).boxed()
 | 
							IntStream.rangeClosed(1, 3).boxed()
 | 
				
			||||||
			.forEach(squareRow -> {
 | 
								.forEach(squareRow -> {
 | 
				
			||||||
				IntStream.rangeClosed(1, 3).boxed()
 | 
									IntStream.rangeClosed(1, 3).boxed()
 | 
				
			||||||
					.forEach(squareColumn -> subscribeBlockChecker(digitPublisher, new SquareChecker(squareRow, squareColumn)));
 | 
										.forEach(squareColumn -> squareChecker(squareRow, squareColumn));
 | 
				
			||||||
			});
 | 
								});
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -34,25 +34,35 @@ public class SudokuVerifier implements Flow.Subscriber<Boolean> {
 | 
				
			|||||||
		digitStream.forEach(digitPublisher::submit);
 | 
							digitStream.forEach(digitPublisher::submit);
 | 
				
			||||||
		digitPublisher.close();
 | 
							digitPublisher.close();
 | 
				
			||||||
		// Wait for checking subscribers to finish
 | 
							// Wait for checking subscribers to finish
 | 
				
			||||||
		while (finished.get() < digitPublisher.getSubscribers().size() && solved.get()) {
 | 
							int subscriberCount = digitPublisher.getSubscribers().size();
 | 
				
			||||||
 | 
							while (true) {
 | 
				
			||||||
 | 
								if (!(finished.get() < subscriberCount && solved.get())) break;
 | 
				
			||||||
 | 
								justAMoment();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return solved.get();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void rowCheckerAndColumnChecker(Integer i) {
 | 
				
			||||||
 | 
							subscribeBlockChecker(new RowChecker(i));
 | 
				
			||||||
 | 
							subscribeBlockChecker(new ColumnChecker(i));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void squareChecker(Integer squareRow, Integer squareColumn) {
 | 
				
			||||||
 | 
							subscribeBlockChecker(new SquareChecker(squareRow, squareColumn));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void subscribeBlockChecker(DigitBlockChecker blockChecker) {
 | 
				
			||||||
 | 
							digitPublisher.subscribe(blockChecker);
 | 
				
			||||||
 | 
							blockChecker.subscribe(this);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void justAMoment() {
 | 
				
			||||||
		try {
 | 
							try {
 | 
				
			||||||
			Thread.sleep(5);
 | 
								Thread.sleep(5);
 | 
				
			||||||
		} catch (InterruptedException ex) {
 | 
							} catch (InterruptedException ex) {
 | 
				
			||||||
			System.out.println(ex.fillInStackTrace());
 | 
								System.out.println(ex.fillInStackTrace());
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
		return solved.get();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private void rowCheckerAndColumnChecker(SubmissionPublisher<String> digitPublisher, Integer i) {
 | 
					 | 
				
			||||||
		subscribeBlockChecker(digitPublisher, new RowChecker(i));
 | 
					 | 
				
			||||||
		subscribeBlockChecker(digitPublisher, new ColumnChecker(i));
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private void subscribeBlockChecker(SubmissionPublisher<String> digitPublisher, DigitBlockChecker blockChecker) {
 | 
					 | 
				
			||||||
		digitPublisher.subscribe(blockChecker);
 | 
					 | 
				
			||||||
		blockChecker.subscribe(this);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
	public void onSubscribe(Flow.Subscription subscription) {
 | 
						public void onSubscribe(Flow.Subscription subscription) {
 | 
				
			||||||
@@ -69,8 +79,8 @@ public class SudokuVerifier implements Flow.Subscriber<Boolean> {
 | 
				
			|||||||
	@Override
 | 
						@Override
 | 
				
			||||||
	public void onError(Throwable throwable) {
 | 
						public void onError(Throwable throwable) {
 | 
				
			||||||
		System.err.println(throwable.fillInStackTrace());
 | 
							System.err.println(throwable.fillInStackTrace());
 | 
				
			||||||
		solved.compareAndSet(true, false);
 | 
					 | 
				
			||||||
		finished.incrementAndGet();
 | 
							finished.incrementAndGet();
 | 
				
			||||||
 | 
							System.exit(1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user