2
0
mirror of https://github.com/esiur/esiur-dart.git synced 2026-04-02 01:38:20 +00:00

Refactor Core

This commit is contained in:
Mohammed Salman
2019-08-31 16:52:05 +03:00
parent 0ff70efde8
commit 57c8fc903d
10 changed files with 245 additions and 355 deletions

View File

@@ -1,52 +1,46 @@
import 'AsyncReply.dart';
class AsyncBag<T> extends AsyncReply<List<T>>
{
class AsyncBag<T> extends AsyncReply<List<T>> {
List<AsyncReply<T>> _replies = List<AsyncReply<T>>();
List<T> _results = List<T>();
List<AsyncReply<T>> _replies = new List<AsyncReply<T>>();
List<T> _results = new List<T>();
int _count = 0;
bool _sealedBag = false;
int _count = 0;
bool _sealedBag = false;
seal() {
if (_sealedBag) {
return;
}
_sealedBag = true;
seal()
{
if (_sealedBag)
return;
if (_results.length == 0) {
trigger(List<T>());
}
_sealedBag = true;
for (var i = 0; i < _results.length; i++) {
var k = _replies[i];
var index = i;
if (_results.length == 0)
trigger(new List<T>());
for (var i = 0; i < _results.length; i++)
{
var k = _replies[i];
var index = i;
k.then((r)
{
_results[index] = r;
_count++;
if (_count == _results.length)
trigger(_results);
});
k.then((r) {
_results[index] = r;
_count++;
if (_count == _results.length) {
trigger(_results);
}
});
}
}
add(AsyncReply<T> reply)
{
if (!_sealedBag)
{
_results.add(null);
_replies.add(reply);
}
add(AsyncReply<T> reply) {
if (!_sealedBag) {
_results.add(null);
_replies.add(reply);
}
}
addBag(AsyncBag<T> bag)
{
bag._replies.forEach((r) {
add(r);
});
}
addBag(AsyncBag<T> bag) {
bag._replies.forEach((r) {
add(r);
});
}
}

View File

@@ -1,33 +1,27 @@
import 'ExceptionCode.dart';
import 'ErrorType.dart';
class AsyncException implements Exception
{
final ErrorType type;
final int code;
final String message;
class AsyncException implements Exception {
AsyncException(this.type, this.code, this.message);
AsyncException(this.type, this.code, this.message)
{
final ErrorType type;
final int code;
final String message;
static toAsyncException(Exception ex) => ex is AsyncException
? ex
: new AsyncException(ErrorType.Exception, 0, ex.toString());
String errMsg() {
if (type == ErrorType.Management) {
return ExceptionCode.values.elementAt(code).toString() +
": " +
(message ?? "");
} else {
return code.toString() + ": " + message;
}
static toAsyncException(Exception ex)
{
return ex is AsyncException ? ex
: new AsyncException(ErrorType.Exception, 0, ex.toString());
}
String errMsg() {
if (type == ErrorType.Management)
return ExceptionCode.values.elementAt(code).toString() + ": " + (message ?? "");
else
return code.toString() + ": " + message;
}
@override
String toString() {
return errMsg();
}
@override
String toString() => errMsg();
}

View File

@@ -2,50 +2,33 @@ library esiur;
import 'AsyncReply.dart';
class AsyncQueue<T> extends AsyncReply<T>
{
List<AsyncReply<T>> _list = new List<AsyncReply<T>>();
class AsyncQueue<T> extends AsyncReply<T> {
List<AsyncReply<T>> _list = <AsyncReply<T>>[];
// object queueLock = new object();
add(AsyncReply<T> reply)
{
//lock (queueLock)
_list.add(reply);
void add(AsyncReply<T> reply) {
_list.add(reply);
//super._resultReady = false;
super.setResultReady(false);
super.setResultReady(false);
reply.then(processQueue);
}
remove(AsyncReply<T> reply)
{
//lock (queueLock)
_list.remove(reply);
processQueue(null);
}
void processQueue(T o)
{
//lock (queueLock)
for (var i = 0; i < _list.length; i++)
if (_list[i].ready)
{
super.trigger(_list[i].result);
_list.removeAt(i);
i--;
}
else
break;
//super._resultReady = (_list.length == 0);
super.setResultReady(_list.length == 0);
}
AsyncQueue()
{
}
reply.then(processQueue);
}
void remove(AsyncReply<T> reply) {
_list.remove(reply);
processQueue();
}
void processQueue([T o = null]) {
for (var i = 0; i < _list.length; i++) {
if (_list[i].ready) {
super.trigger(_list[i].result);
_list.removeAt(i);
i--;
} else {
break;
}
}
super.setResultReady(_list.length == 0);
}
}

View File

@@ -26,195 +26,127 @@ import 'dart:core';
import 'AsyncException.dart';
import 'ProgressType.dart';
class AsyncReply<T> implements Future<T>
{
class AsyncReply<T> implements Future<T> {
AsyncReply();
List<Function(T)> _callbacks = new List<Function(T)>();
List<Function(T)> _callbacks = <Function(T)>[];
T _result;
T _result;
List<Function(AsyncException)> _errorCallbacks = new List<Function(AsyncException)>();
List<Function(ProgressType, int, int)> _progressCallbacks = new List<Function(ProgressType, int, int)>();
final _errorCallbacks = <Function(AsyncException)>[];
List<Function(T)> _chunkCallbacks = new List<Function(T)>();
final _progressCallbacks = <Function(ProgressType, int, int)>[];
final _chunkCallbacks = <Function(T)>[];
bool _resultReady = false;
AsyncException _exception;
bool _resultReady = false;
AsyncException _exception;
bool get ready => _resultReady;
T get result => _result;
bool get ready
{
return _resultReady;
}
setResultReady(bool val) => _resultReady = val;
T get result
{
return _result;
}
AsyncReply<R> then<R>(FutureOr<R> onValue(T value), {Function onError}) {
_callbacks.add(onValue);
setResultReady(bool val)
{
_resultReady = val;
}
AsyncReply<R> then<R>(FutureOr<R> onValue(T value), {Function onError})
{
_callbacks.add(onValue);
if (onError != null)
{
if (onError is Function(dynamic, dynamic))
{
_errorCallbacks.add((ex)=>onError(ex, null));
}
else if (onError is Function(dynamic))
{
_errorCallbacks.add(onError);
}
else if (onError is Function())
{
_errorCallbacks.add((ex)=>onError());
}
if (onError != null) {
if (onError is Function(dynamic, dynamic)) {
_errorCallbacks.add((ex) => onError(ex, null));
} else if (onError is Function(dynamic)) {
_errorCallbacks.add(onError);
} else if (onError is Function()) {
_errorCallbacks.add((ex) => onError());
}
}
if (_resultReady) onValue(result);
if (_resultReady)
onValue(result);
return this as AsyncReply<R>;
return this as AsyncReply<R>;
}
AsyncReply<T> whenComplete(FutureOr action())
{
return this;
//_callbacks.add(action);
}
AsyncReply<T> whenComplete(FutureOr action()) => this;
Stream<T> asStream()
{
return null;
}
Stream<T> asStream() => null;
AsyncReply<T> catchError(Function onError, {bool test(Object error)})
{
return this.error(onError);
}
AsyncReply<T> catchError(Function onError, {bool test(Object error)}) =>
this.error(onError);
AsyncReply<T> timeout(Duration timeLimit, {FutureOr<T> onTimeout()}) => this;
@deprecated
AsyncReply<T> _then_old(Function(T) callback) {
_callbacks.add(callback);
if (_resultReady) callback(result);
AsyncReply<T> timeout(Duration timeLimit, {FutureOr<T> onTimeout()})
{
return this;
}
AsyncReply<T> _then_old(Function(T) callback)
{
_callbacks.add(callback);
AsyncReply<T> error(Function(dynamic) callback) {
_errorCallbacks.add(callback);
if (_resultReady)
callback(result);
if (_exception != null) callback(_exception);
return this;
return this;
}
AsyncReply<T> progress(Function(ProgressType, int, int) callback) {
_progressCallbacks.add(callback);
return this;
}
AsyncReply<T> chunk(Function(T) callback) {
_chunkCallbacks.add(callback);
return this;
}
void trigger(T result) {
if (_resultReady) {
return;
}
AsyncReply<T> error(Function(dynamic) callback)
{
_errorCallbacks.add(callback);
_result = result;
_resultReady = true;
if (_exception != null)
callback(_exception);
return this;
_callbacks.forEach((x) {
x(result);
});
}
triggerError(Exception exception) {
if (_resultReady) {
return;
}
AsyncReply<T> progress(Function(ProgressType, int, int) callback)
{
_progressCallbacks.add(callback);
return this;
_exception = AsyncException.toAsyncException(exception);
_errorCallbacks.forEach((x) {
x(_exception);
});
}
triggerProgress(ProgressType type, int value, int max) {
if (_resultReady) {
return;
}
AsyncReply<T> chunk(Function(T) callback)
{
_chunkCallbacks.add(callback);
return this;
}
_progressCallbacks.forEach((x) {
x(type, value, max);
});
}
void trigger(T result)
{
triggerChunk(T value) {
if (_resultReady) return;
// lock (callbacksLock)
// {
if (_resultReady)
return;
_chunkCallbacks.forEach((x) {
x(value);
});
}
_result = result;
_resultReady = true;
_callbacks.forEach((x) {
x(result);
});
// }
}
triggerError(Exception exception)
{
if (_resultReady)
return;
_exception = AsyncException.toAsyncException(exception);
///lock (callbacksLock)
//{
_errorCallbacks.forEach((x) {
x(_exception);
});
//}
}
triggerProgress(ProgressType type, int value, int max)
{
if (_resultReady)
return;
//lock (callbacksLock)
//{
_progressCallbacks.forEach((x) {
x(type, value, max);
});
//}
}
triggerChunk(T value)
{
if (_resultReady)
return;
//lock (callbacksLock)
//{
_chunkCallbacks.forEach((x) {
x(value);
});
//}
}
AsyncReply.ready(T result)
{
_resultReady = true;
_result = result;
}
AsyncReply()
{
}
}
AsyncReply.ready(T result) {
_resultReady = true;
_result = result;
}
}

View File

@@ -1,5 +1 @@
enum ErrorType
{
Management,
Exception
}
enum ErrorType { Management, Exception }

View File

@@ -1,31 +1,29 @@
enum ExceptionCode
{
HostNotReachable,
AccessDenied,
ResourceNotFound,
AttachDenied,
InvalidMethod,
InvokeDenied,
CreateDenied,
AddParentDenied,
AddChildDenied,
ViewAttributeDenied,
UpdateAttributeDenied,
StoreNotFound,
ParentNotFound,
ChildNotFound,
ResourceIsNotStore,
DeleteDenied,
DeleteFailed,
UpdateAttributeFailed,
GetAttributesFailed,
ClearAttributesFailed,
TemplateNotFound,
RenameDenied,
ClassNotFound,
MethodNotFound,
PropertyNotFound,
SetPropertyDenied,
ReadOnlyProperty
}
enum ExceptionCode {
HostNotReachable,
AccessDenied,
ResourceNotFound,
AttachDenied,
InvalidMethod,
InvokeDenied,
CreateDenied,
AddParentDenied,
AddChildDenied,
ViewAttributeDenied,
UpdateAttributeDenied,
StoreNotFound,
ParentNotFound,
ChildNotFound,
ResourceIsNotStore,
DeleteDenied,
DeleteFailed,
UpdateAttributeFailed,
GetAttributesFailed,
ClearAttributesFailed,
TemplateNotFound,
RenameDenied,
ClassNotFound,
MethodNotFound,
PropertyNotFound,
SetPropertyDenied,
ReadOnlyProperty
}

View File

@@ -1,10 +1,7 @@
// library esiur;
import 'IEventHandler.dart';
typedef DestroyedEvent(sender);
abstract class IDestructible extends IEventHandler
{
void destroy();
}
abstract class IDestructible extends IEventHandler {
void destroy();
}

View File

@@ -1,48 +1,45 @@
class IEventHandler
{
Map<String, List<Function>> _events;
class IEventHandler {
Map<String, List<Function>> _events;
register(String event)
{
_events[event.toLowerCase()] = [];
}
register(String event) {
_events[event.toLowerCase()] = [];
}
IEventHandler()
{
_events = {};
}
IEventHandler() {
_events = {};
}
emitArgs(String event, List arguments)
{
event = event.toLowerCase();
if (_events.containsKey(event))
for(var i = 0; i < _events[event].length; i++)
if (Function.apply(_events[event][i], arguments) != null)
return true;
return false;
}
on(String event, Function callback)
{
event = event.toLowerCase();
// add
if (!_events.containsKey(event))
register(event);
_events[event].add(callback);
return this;
}
off(event, callback)
{
event = event.toString();
if (_events.containsKey(event))
{
if (callback != null)
_events[event].remove(callback);
else
this._events[event] = [];
emitArgs(String event, List arguments) {
event = event.toLowerCase();
if (_events.containsKey(event)) {
for (var i = 0; i < _events[event].length; i++) {
if (Function.apply(_events[event][i], arguments) != null) {
return true;
}
}
}
return false;
}
on(String event, Function callback) {
event = event.toLowerCase();
if (!_events.containsKey(event)) register(event);
_events[event].add(callback);
return this;
}
off(event, callback) {
event = event.toString();
if (_events.containsKey(event)) {
if (callback != null) {
_events[event].remove(callback);
} else {
this._events[event] = [];
}
}
}
}

View File

@@ -1,5 +1,4 @@
enum ProgressType
{
Execution,
Network,
}
enum ProgressType {
Execution,
Network,
}

View File

@@ -1,5 +1,5 @@
# Generated by pub
# See https://www.dartlang.org/tools/pub/glossary#lockfile
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
analyzer:
dependency: transitive