d-webservice-example/source/d_webservice_example/business/todo_notification_service.d

44 lines
1.3 KiB
D
Raw Permalink Normal View History

2019-01-03 03:33:42 +01:00
module d_webservice_example.business.todo_notification_service;
class TodoNotificationService
{
import d_webservice_example.data.todo_notification : TodoNotification;
import d_webservice_example.enums.todo_notification_type : TodoNotificationType;
import d_webservice_example.mapper.todo_mapper : asTodoTO;
import d_webservice_example.model.todo : Todo;
import std.traits : EnumMembers;
private:
bool[void delegate(scope TodoNotification) @safe] listeners;
public:
this() const nothrow pure @nogc @safe
{
}
void registerListener(scope void delegate(scope const TodoNotification) @safe listener) @safe
{
listeners[listener] = true;
}
void unRegisterListener(scope void delegate(scope const TodoNotification) @safe listener) @safe
{
listeners.remove(listener);
}
static foreach (method; EnumMembers!TodoNotificationType)
{
import std.conv: to;
import std.format : format;
mixin(format!q{
void onTodo%1$sd(const Todo todo) @safe
{
import std.algorithm.iteration : each;
immutable todoChange = TodoNotification(TodoNotificationType.%1$s, todo);
listeners.byKey.each!(listener => listener(todoChange));
}
}(method.to!string));
}
}