Skip to content
Draft

V1 #91

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions haxe_libraries/coconut.data.hxml
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
# @install: lix --silent download "gh://github.com/MVCoconut/coconut.data#587d2c2dbc57cc24ecb52303c5e22eb97fed12cd" into coconut.data/0.12.1/github/587d2c2dbc57cc24ecb52303c5e22eb97fed12cd
# @install: lix --silent download "gh://github.com/MVCoconut/coconut.data#ca17dc7efb408b8032116493fb2e02f362382956" into coconut.data/0.12.1/github/ca17dc7efb408b8032116493fb2e02f362382956
-lib tink_anon
-lib tink_priority
-lib tink_pure
-lib tink_state
-cp ${HAXE_LIBCACHE}/coconut.data/0.12.1/github/587d2c2dbc57cc24ecb52303c5e22eb97fed12cd/src
-D coconut.data=0.12.1
--macro coconut.data.macros.Setup.run()
-cp ${HAXE_LIBCACHE}/coconut.data/0.12.1/github/ca17dc7efb408b8032116493fb2e02f362382956/src
-D coconut.data=0.12.1
6 changes: 3 additions & 3 deletions haxe_libraries/coconut.diffing.hxml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# @install: lix --silent download "gh://github.com/MVCoconut/coconut.diffing#867b48ea374077d1ff15b05de4e07430637217ea" into coconut.diffing/0.2.1/github/867b48ea374077d1ff15b05de4e07430637217ea
# @install: lix --silent download "gh://github.com/MVCoconut/coconut.diffing#499d62647c2ff68ad1336a311005f9f9d8cdf332" into coconut.diffing/0.5.0/github/499d62647c2ff68ad1336a311005f9f9d8cdf332
-lib coconut.ui
-cp ${HAXE_LIBCACHE}/coconut.diffing/0.2.1/github/867b48ea374077d1ff15b05de4e07430637217ea/src
-D coconut.diffing=0.2.1
-cp ${HAXE_LIBCACHE}/coconut.diffing/0.5.0/github/499d62647c2ff68ad1336a311005f9f9d8cdf332/src
-D coconut.diffing=0.5.0
6 changes: 3 additions & 3 deletions haxe_libraries/coconut.react-core.hxml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# @install: lix --silent download "gh://github.com/MVCoconut/coconut.react-core#e2d2eab146d79940dfd253700efb94ad033504ca" into coconut.react-core/0.2.2/github/e2d2eab146d79940dfd253700efb94ad033504ca
# @install: lix --silent download "gh://github.com/MVCoconut/coconut.react-core#84f0f5b150699de2e27ce2e19c9063d1a1ba3732" into coconut.react-core/0.3.0/github/84f0f5b150699de2e27ce2e19c9063d1a1ba3732
-lib coconut.ui
-lib react-next
-lib tink_priority
-cp ${HAXE_LIBCACHE}/coconut.react-core/0.2.2/github/e2d2eab146d79940dfd253700efb94ad033504ca/src
-D coconut.react-core=0.2.2
-cp ${HAXE_LIBCACHE}/coconut.react-core/0.3.0/github/84f0f5b150699de2e27ce2e19c9063d1a1ba3732/src
-D coconut.react-core=0.3.0
--macro coconut.react.macros.Setup.all()
-D coconut_react_core
10 changes: 5 additions & 5 deletions haxe_libraries/coconut.react-dom.hxml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# @install: lix --silent download "gh://github.com/MVCoconut/coconut.react-dom#23744776318ac391d8613d521649660253e11964" into coconut.react-dom/0.1.0/github/23744776318ac391d8613d521649660253e11964
# @install: lix --silent download "gh://github.com/MVCoconut/coconut.react-dom#f569d03939e1b6035d7453723ef66e97deb410b1" into coconut.react-dom/0.3.0/github/f569d03939e1b6035d7453723ef66e97deb410b1
-lib coconut.react-core
-lib xDOM
-cp ${HAXE_LIBCACHE}/coconut.react-dom/0.1.0/github/23744776318ac391d8613d521649660253e11964/src
-D coconut.react-dom=0.1.0
--macro coconut.react.macros.Html.registerTags()
-lib tink_domspec
-cp ${HAXE_LIBCACHE}/coconut.react-dom/0.3.0/github/f569d03939e1b6035d7453723ef66e97deb410b1/src
-D coconut.react-dom=0.3.0
--macro coconut.react.Html.init()
6 changes: 3 additions & 3 deletions haxe_libraries/coconut.vdom.hxml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# @install: lix --silent download "gh://github.com/MVCoconut/coconut.vdom#98cb1bf86b63312f3e0507f3b6e7bd79835861e6" into coconut.vdom/0.8.1/github/98cb1bf86b63312f3e0507f3b6e7bd79835861e6
# @install: lix --silent download "gh://github.com/MVCoconut/coconut.vdom#710301040bf6da83530a182e25e24af4d4c31884" into coconut.vdom/0.10.0/github/710301040bf6da83530a182e25e24af4d4c31884
-lib coconut.diffing
-lib xDOM
-cp ${HAXE_LIBCACHE}/coconut.vdom/0.8.1/github/98cb1bf86b63312f3e0507f3b6e7bd79835861e6/src
-D coconut.vdom=0.8.1
-cp ${HAXE_LIBCACHE}/coconut.vdom/0.10.0/github/710301040bf6da83530a182e25e24af4d4c31884/src
-D coconut.vdom=0.10.0
4 changes: 2 additions & 2 deletions haxe_libraries/tink_anon.hxml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# @install: lix --silent download "gh://github.com/haxetink/tink_anon#a44bdda9caa41d461f9b0a43366ea9c320260963" into tink_anon/0.7.0/github/a44bdda9caa41d461f9b0a43366ea9c320260963
# @install: lix --silent download "gh://github.com/haxetink/tink_anon#0277e6e3f97a7878f1aa9aeeccc4b7be0e9c82bc" into tink_anon/0.7.0/github/0277e6e3f97a7878f1aa9aeeccc4b7be0e9c82bc
-lib tink_macro
-cp ${HAXE_LIBCACHE}/tink_anon/0.7.0/github/a44bdda9caa41d461f9b0a43366ea9c320260963/src
-cp ${HAXE_LIBCACHE}/tink_anon/0.7.0/github/0277e6e3f97a7878f1aa9aeeccc4b7be0e9c82bc/src
-D tink_anon=0.7.0
6 changes: 3 additions & 3 deletions haxe_libraries/tink_core.hxml
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# @install: lix --silent download "gh://github.com/haxetink/tink_core#83032eb4327a73d8dd90a36d720d0d30154bb300" into tink_core/2.0.1/github/83032eb4327a73d8dd90a36d720d0d30154bb300
-cp ${HAXE_LIBCACHE}/tink_core/2.0.1/github/83032eb4327a73d8dd90a36d720d0d30154bb300/src
-D tink_core=2.0.1
# @install: lix --silent download "gh://github.com/haxetink/tink_core#f500203b657859bfde36c49e54f95a0b1fc2b165" into tink_core/2.0.2/github/f500203b657859bfde36c49e54f95a0b1fc2b165
-cp ${HAXE_LIBCACHE}/tink_core/2.0.2/github/f500203b657859bfde36c49e54f95a0b1fc2b165/src
-D tink_core=2.0.2
4 changes: 2 additions & 2 deletions haxe_libraries/tink_hxx.hxml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# @install: lix --silent download "gh://github.com/haxetink/tink_hxx#0d6cda883d5ef4c1186dbad476e016b98aad68b8" into tink_hxx/0.25.0/github/0d6cda883d5ef4c1186dbad476e016b98aad68b8
# @install: lix --silent download "gh://github.com/haxetink/tink_hxx#783a4606516582567d9f6f12505740ba48334c39" into tink_hxx/0.25.0/github/783a4606516582567d9f6f12505740ba48334c39
-lib html-entities
-lib tink_anon
-lib tink_parse
-cp ${HAXE_LIBCACHE}/tink_hxx/0.25.0/github/0d6cda883d5ef4c1186dbad476e016b98aad68b8/src
-cp ${HAXE_LIBCACHE}/tink_hxx/0.25.0/github/783a4606516582567d9f6f12505740ba48334c39/src
-D tink_hxx=0.25.0
4 changes: 2 additions & 2 deletions haxe_libraries/tink_state.hxml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# @install: lix --silent download "gh://github.com/haxetink/tink_state#b01eb8bd47f7264420604b5f8816dde69e5dec55" into tink_state/1.0.0-beta.3/github/b01eb8bd47f7264420604b5f8816dde69e5dec55
# @install: lix --silent download "gh://github.com/haxetink/tink_state#9fda3b07ea27e299e7f53720d6e349787477268e" into tink_state/1.0.0-beta.3/github/9fda3b07ea27e299e7f53720d6e349787477268e
-lib tink_core
-cp ${HAXE_LIBCACHE}/tink_state/1.0.0-beta.3/github/b01eb8bd47f7264420604b5f8816dde69e5dec55/src
-cp ${HAXE_LIBCACHE}/tink_state/1.0.0-beta.3/github/9fda3b07ea27e299e7f53720d6e349787477268e/src
-D tink_state=1.0.0-beta.3
8 changes: 4 additions & 4 deletions haxe_libraries/travix.hxml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# @install: lix --silent download "gh://github.com/back2dos/travix#63b230b854c6f02cf2ac04bb758c09751f28b8e8" into travix/0.15.0/github/63b230b854c6f02cf2ac04bb758c09751f28b8e8
# @post-install: cd ${HAXE_LIBCACHE}/travix/0.15.0/github/63b230b854c6f02cf2ac04bb758c09751f28b8e8 && haxe -cp src --run travix.PostDownload
# @run: haxelib run-dir travix ${HAXE_LIBCACHE}/travix/0.15.0/github/63b230b854c6f02cf2ac04bb758c09751f28b8e8
# @install: lix --silent download "haxelib:/travix#0.15.0" into travix/0.15.0/haxelib
# @post-install: cd ${HAXE_LIBCACHE}/travix/0.15.0/haxelib && haxe -cp src --run travix.PostDownload
# @run: haxelib run-dir travix ${HAXE_LIBCACHE}/travix/0.15.0/haxelib
-lib tink_cli
-cp ${HAXE_LIBCACHE}/travix/0.15.0/github/63b230b854c6f02cf2ac04bb758c09751f28b8e8/src
-cp ${HAXE_LIBCACHE}/travix/0.15.0/haxelib/src
-D travix=0.15.0
--macro travix.Macro.setup()
31 changes: 31 additions & 0 deletions src/coconut/ui/internal/Attribute.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package coconut.ui.internal;

import tink.state.*;
import tink.state.internal.*;

@:forward(value, assign)
abstract Attribute<T>(Impl<T>) {

public inline function new(compute, ?comparator #if tink_state.debug , toString #end)
this = new Impl(compute, comparator);
}

private class Impl<T> extends AutoObservable<T> {
final dFault:()->T;
final state:State<()->T>;

public function new(compute:()->T, ?comparator) {
this.state = new State(this.dFault = compute);
super(() -> switch state.value {
case null: dFault();
case f: switch f() {
case null: dFault();
case v: v;
}
}, comparator);
}

public function assign(c:Null<()->T>)
state.set(c);

}
5 changes: 5 additions & 0 deletions src/coconut/ui/internal/Children.hx
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,9 @@ abstract Children<RenderResult>(Array<RenderResult>) from Array<RenderResult> {
}

@:from macro static function ofOther(e:haxe.macro.Expr);

static final EMPTY = new Array<Dynamic>();

public inline function keyValueIterator()
return (if (this != null) this else EMPTY).keyValueIterator();
}
52 changes: 52 additions & 0 deletions src/coconut/ui/internal/Controlled.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package coconut.ui.internal;

import tink.state.*;
import tink.state.internal.*;

@:forward(value, assign)
abstract Controlled<T>(Impl<T>) {

public inline function new(compute, ?comparator)
this = new Impl(compute, comparator);
}

private class Impl<T> implements ObservableObject<T> extends Dispatcher {

final fallback:tink.core.Lazy<State<T>>;
var cur:Null<State<T>>;
final comparator:Comparator<T>;

public var value(get, set):T;
inline function get_value():T
return state().value;

inline function set_value(param):T
return state().value = param;

inline function state()
return switch cur {
case null: fallback.get();
case v: v;
}

public function new(fallback, ?comparator) {
super();
this.comparator = comparator;
this.fallback = fallback;
}

public function assign(c:Null<State<T>>)
if (c != cur) {
cur = c;
fire(this);
}

public function getValue():T
return state().value;

public function isValid():Bool
return false;//TODO: implement

public function getComparator():Comparator<T>
return comparator;
}
50 changes: 21 additions & 29 deletions src/coconut/ui/internal/ImplicitContext.hx
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
package coconut.ui.internal;

import tink.state.*;
import coconut.data.Value;
using tink.CoreApi;
#if macro
using tink.MacroApi;
#end

class ImplicitContext {

final parent:Lazy<Null<ImplicitContext>>;
final slots = new Map<TypeKey<Dynamic>, Slot<Dynamic, Value<Dynamic>>>();
final slots = new Mapping<Attribute<Dynamic>>();

public function new(?parent) {
this.parent = switch parent {
Expand All @@ -20,41 +18,32 @@ class ImplicitContext {
}

static final ORPHAN:Lazy<Null<ImplicitContext>> = (null:ImplicitContext);
static final NONE = Observable.const(new ImplicitValues([]));

public function get<T>(key:TypeKey<T>):Null<T>
return switch [getSlot(key).value, parent.get()] {
case [null, null]: null;
case [null, p]: p.get(key);
case [v, _]: v;
return switch getSlot(key).value {
case null:
switch parent.get() {
case null: null;
case ctx: ctx.get(key);
}
case v: v;
}

function getSlot(key)
return switch slots[key] {
case null: slots[key] = new Slot(this);// in theory, creating slots and never destroying them leaks ... in practice, the key set for every context should always be small and well-bound, and typically constant
case null: slots[key] = new Attribute(() -> Noise);// in theory, creating slots and never destroying them leaks ... in practice, the key set for every context should always be small and well-bound, and typically constant
case v: v;
}

public function update(values:ImplicitValues) {

for (k => slot in slots)
if (!values.exists(k)) slot.setData(null);

for (k => v in values)
getSlot(k).setData(v);
slots.forEach((slot, k, _) -> if (!values.exists(k)) slot.assign(null));
values.forEach((v, k, _) -> getSlot(k).assign(v));
}

static public macro function with(e) {
var exprs = switch e.expr { case EArrayDecl(a): a; default: [e]; };
var entries = [for (e in exprs) switch e {
case macro $k => $v:
macro @:pos(e.pos) new coconut.ui.internal.ImplicitContext.SingleImplicit($k, $v);
default: e.reject('expected key => value');
}];
return macro new coconut.ui.internal.ImplicitContext.ImplicitValues([$a{entries}]);
}
static public macro function with(e);
}

private typedef Mapping<T> = tink.state.internal.ObjectMap<TypeKey<Dynamic>, T>;
abstract TypeKey<T>({}) to {} {
@:from static function ofClass<T>(t:Class<T>):TypeKey<T>
return cast t;
Expand All @@ -63,19 +52,22 @@ abstract TypeKey<T>({}) to {} {
}

@:pure
@:forward(exists, get, keyValueIterator)
@:forward(exists, get, forEach)
@:fromHxx(
transform = coconut.ui.internal.ImplicitContext.with(_)
)
abstract ImplicitValues(Map<TypeKey<Dynamic>, Value<Dynamic>>) {
public function new(a:Array<SingleImplicit>) this = [for (o in a) o.key => o.val];
abstract ImplicitValues(Mapping<tink.hxx.Expression<Dynamic>>) {
public function new(a:Array<SingleImplicit>) {
this = new Mapping();
for (o in a) this[o.key] = o.val;
}
}

class SingleImplicit {
public final key:TypeKey<Dynamic>;
public final val:Value<Dynamic>;
public final val:tink.hxx.Expression<Dynamic>;

public function new<T>(key:TypeKey<T>, val:Value<T>) {
public function new<T>(key:TypeKey<T>, val:tink.hxx.Expression<T>) {
this.key = key;
this.val = val;
}
Expand Down
21 changes: 21 additions & 0 deletions src/coconut/ui/internal/ImplicitContext.macro.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package coconut.ui.internal;

import haxe.macro.Expr;
using tink.MacroApi;

class ImplicitContext {

static function with(e:Expr) {
switch e {
case macro ($v): e = v;
default:
}
var exprs = switch e.expr { case EArrayDecl(a): a; default: [e]; };
var entries = [for (e in exprs) switch e {
case macro $k => $v:
macro @:pos(e.pos) new coconut.ui.internal.ImplicitContext.SingleImplicit($k, function () return $v);
default: e.reject('expected key => value, but got ${e.toString()}');
}];
return macro new coconut.ui.internal.ImplicitContext.ImplicitValues([$a{entries}]);
}
}
Loading