Skip to content
This repository has been archived by the owner on Apr 23, 2020. It is now read-only.

Commit

Permalink
Added signals.
Browse files Browse the repository at this point in the history
  • Loading branch information
back2dos committed Apr 26, 2012
1 parent 0627a97 commit 2b03ddc
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 3 deletions.
7 changes: 4 additions & 3 deletions src/tink/lang/macros/ClassBuilder.hx
Expand Up @@ -14,7 +14,7 @@ class ClassBuilder {
}
static function noBindings(ctx:ClassBuildContext) {
#if debug
var bindable = [':bindable', ':cache'];
var bindable = [':bindable', ':cache', ':signal'];
for (m in ctx.members)
for (tag in bindable)
switch (m.extractMeta(tag)) {
Expand All @@ -30,10 +30,11 @@ class ClassBuilder {
Forward.process,
PropBuilder.process,
#if tink_reactive //probably shouldn't be here but it's very convenient for now
tink.reactive.bindings.macros.BindableProperties.make
tink.reactive.bindings.macros.BindableProperties.make,
tink.reactive.signals.macros.SignalBuilder.make
#else
noBindings
#end,
#end
];
#end
}
28 changes: 28 additions & 0 deletions src/tink/reactive/signals/Signal.hx
@@ -0,0 +1,28 @@
package tink.reactive.signals;
import tink.collections.maps.FunctionMap;

/**
* ...
* @author back2dos
*/

interface Signal<T> {
function watch(handler:T->Dynamic):Void;
function unwatch(handler:T->Dynamic):Void;
}

class SimpleSignal<T> implements Signal<T> {
var handlers:FunctionMap<T->Dynamic, T->Dynamic>;
public function new() {
this.handlers = new FunctionMap();
}
public function watch(handler) {
handlers.set(handler, handler);
}
public function unwatch(handler) {
handlers.remove(handler);
}
public function fire(data:T) {
for (h in handlers.keys()) h(data);
}
}
37 changes: 37 additions & 0 deletions src/tink/reactive/signals/macros/SignalBuilder.hx
@@ -0,0 +1,37 @@
package tink.reactive.signals.macros;

/**
* ...
* @author back2dos
*/
import tink.macro.build.Member;
import tink.macro.build.MemberTransformer;
import haxe.macro.Expr;

using tink.macro.tools.MacroTools;

class SignalBuilder {
static inline var SIGNAL = ':signal';
static public function make(ctx:ClassBuildContext) {
for (member in ctx.members)
switch (member.extractMeta(SIGNAL)) {
case Success(tag):
switch (member.kind) {
case FVar(t, e):
if (e != null) e.reject();
if (t == null) member.pos.error('type required');

var own = '_' + member.name;
ctx.add(Member.plain(own, 'tink.reactive.signals.Signal.SimpleSignal'.asComplexType([TPType(t)]), tag.pos));

member.kind = FProp('default', 'null', 'tink.reactive.signals.Signal'.asComplexType([TPType(t)]));
ctx.getCtor().init(member.name, tag.pos, own.resolve(tag.pos), true);
ctx.getCtor().init(own, tag.pos, 'tink.reactive.signals.Signal.SimpleSignal'.instantiate(tag.pos), true);
member.publish();
default:
member.pos.error('can only declare signals on variables');
}
default:
}
}
}

0 comments on commit 2b03ddc

Please sign in to comment.