2023-10-28 20:46:47 +02:00
|
|
|
import 'package:flutter/foundation.dart';
|
2024-02-23 18:58:31 +01:00
|
|
|
import 'package:flutter_stockfish_plugin/stockfish_bindings.dart';
|
|
|
|
import 'package:flutter_stockfish_plugin/stockfish_native_bindings.dart'
|
|
|
|
if (dart.library.html) 'package:flutter_stockfish_plugin/stockfish_web_bindings.dart';
|
|
|
|
import 'package:flutter_stockfish_plugin/stockfish_state.dart';
|
2023-10-28 20:46:47 +02:00
|
|
|
|
2024-02-23 18:58:31 +01:00
|
|
|
final StockfishChessEngineAbstractBindings _bindings =
|
|
|
|
StockfishChessEngineBindings();
|
2023-10-28 20:46:47 +02:00
|
|
|
|
|
|
|
class Stockfish {
|
2024-02-23 18:58:31 +01:00
|
|
|
final _state = StockfishStateClass();
|
|
|
|
|
|
|
|
Stockfish._() {
|
|
|
|
_state.setValue(StockfishState.starting);
|
|
|
|
_bindings.stockfishMain(() {
|
|
|
|
_state.setValue(StockfishState.ready);
|
|
|
|
}).then((exitCode) {
|
|
|
|
_state.setValue(
|
|
|
|
exitCode == 0 ? StockfishState.disposed : StockfishState.error);
|
|
|
|
_instance = null;
|
|
|
|
}, onError: (error) {
|
|
|
|
_state.setValue(StockfishState.error);
|
|
|
|
_instance = null;
|
2023-10-28 20:46:47 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
static Stockfish? _instance;
|
|
|
|
|
|
|
|
/// Creates a C++ engine.
|
|
|
|
///
|
|
|
|
/// This may throws a [StateError] if an active instance is being used.
|
|
|
|
/// Owner must [dispose] it before a new instance can be created.
|
|
|
|
factory Stockfish() {
|
|
|
|
if (_instance != null) {
|
|
|
|
throw StateError('Multiple instances are not supported, yet.');
|
|
|
|
}
|
|
|
|
_instance = Stockfish._();
|
|
|
|
return _instance!;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// The current state of the underlying C++ engine.
|
|
|
|
ValueListenable<StockfishState> get state => _state;
|
|
|
|
|
|
|
|
/// The standard output stream.
|
2024-02-23 18:58:31 +01:00
|
|
|
Stream<String> get stdout => _bindings.read;
|
2023-10-28 20:46:47 +02:00
|
|
|
|
|
|
|
/// The standard input sink.
|
|
|
|
set stdin(String line) {
|
2024-02-23 18:58:31 +01:00
|
|
|
final stateValue = state.value;
|
2023-10-28 20:46:47 +02:00
|
|
|
if (stateValue != StockfishState.ready) {
|
|
|
|
throw StateError('Stockfish is not ready ($stateValue)');
|
|
|
|
}
|
2024-02-23 18:58:31 +01:00
|
|
|
_bindings.write(line);
|
2023-10-28 20:46:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Stops the C++ engine.
|
|
|
|
void dispose() {
|
2024-02-23 18:58:31 +01:00
|
|
|
final stateValue = state.value;
|
2023-10-28 20:46:47 +02:00
|
|
|
if (stateValue == StockfishState.ready) {
|
|
|
|
stdin = 'quit';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void _cleanUp(int exitCode) {
|
2024-02-23 18:58:31 +01:00
|
|
|
/*_stdoutController.close();
|
2023-10-28 20:46:47 +02:00
|
|
|
|
|
|
|
_mainSubscription.cancel();
|
|
|
|
_stdoutSubscription.cancel();
|
|
|
|
|
|
|
|
_state._setValue(
|
|
|
|
exitCode == 0 ? StockfishState.disposed : StockfishState.error);
|
|
|
|
|
2024-02-23 18:58:31 +01:00
|
|
|
_instance = null;*/
|
2023-10-28 20:46:47 +02:00
|
|
|
}
|
|
|
|
}
|