Skip to content

Instantly share code, notes, and snippets.

@serjek
Created October 26, 2020 13:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save serjek/4083cbdf26604f8e2b4507c729e183f4 to your computer and use it in GitHub Desktop.
Save serjek/4083cbdf26604f8e2b4507c729e183f4 to your computer and use it in GitHub Desktop.
package;
import io.colyseus.serializer.schema.types.*;
import tink.state.*;
using tink.CoreApi;
typedef MapType<T> = {
var onAdd:(v:T, k:String) -> Void;
var onRemove:(v:T, k:String) -> Void;
var onChange:(v:T, k:String) -> Void;
function keyValueIterator():KeyValueIterator<String, T>;
}
class SchemaUtils {
public static function observeArray<T>(s:ArraySchema<T>, clear:Signal<Noise>):ObservableArray<T> {
var ret = new ObservableArray([for (item in s) item]);
s.onAdd = function(v,k) ret.set(k, v);
s.onRemove = function(v,k) ret.remove(v);
s.onChange = function(v,k) ret.set(k, v);
clear.handle(_ -> ret.clear());
return ret;
}
public static function observeMap<T>(s:MapType<T>, clear:Signal<Noise>):ObservableMap<String,T> {
var ret:ObservableMap<String,T> = new ObservableMap([for (k => v in s) k => v]);
s.onAdd = function(v,k) ret.set(k, v);
s.onRemove = function(v,k) ret.remove(k);
s.onChange = function(v,k) ret.set(k, v);
clear.handle(_ -> ret.clear());
return ret;
}
}
//...........
/**
in handler:
@:signal var stateFieldSignal:DataChange;
room.state.round.onChange = function(v) for (data in v) _stateFieldSignal.trigger(data);
var a = room.state.round.testArray.observeArray(
stateFieldSignal
.filter(v -> v.field == "testArray" && (v.value:ArraySchema<Int>).length == 0)
.map(v -> Noise)
);
var b = SchemaUtils.observeMap(room.state.round.testMap,
stateFieldSignal
.filter(v -> v.field == "testMap" && (v.value:MapSchema<String>).indexes.count() == 0)
.map(v -> Noise)
);
a.observableValues.bind(v -> trace(' -> a', a.toArray()));
b.observableValues.bind(v -> trace(' => b', b.toString()));
/*
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment