init {
	variables := {
		"a" : {
			"target": "w1",
			"source": "a1",
			"value": "_"
		},
		"b": {
			"target": "w3",
			"source": "w2",
			"value": "_"
		}
	}
	datastore := {
		"accounts": {
			"a1": "hello"
		}
	}
}

native channel ScreenUpdate {
	in screen(curSc: Json, update(curSc, nextSc)) = nextSc
}

native channel SetLayout {
	in screen.layout(curLayout: Bool, setLayout(nextLayout)) = nextLayout
}

native channel SetVisible(wid: Str) {
	in screen.widgets.{wid}.visible(curVisible: Bool, setVisible(nextVisible)) = nextVisible
}

native channel SetText(wid: Str) {
	in screen.widgets.{wid}.text(curText: Str, setText(nextText)) = nextText
}

native channel MouseEvent(wid: Str) {
	out screen.widgets.{wid}.state(curState: Int, mouseEvent(nextState)) = nextState
}

native channel TextEvent(wid: Str) {
	out screen.widgets.{wid}.text(curText: Str, textEvent(nextText)) = nextText
}

channel AddButton {
	out screen.widgets(widgets: Map, addButton(wid: Str, text: Str)) = insert(widgets, wid, {"type": "button", "text": text, "state": 0})
}

channel AddTextInput {
	out screen.widgets(widgets: Map, addTextInput(wid: Str)) = insert(widgets, wid, {"type": "textInput", "text": "", "state": 0})
}

channel signUp{
	out datastore.accounts(accounts: Map, signUp(id, name)) = insert(accounts, id, name)
}

channel changeName(aid: Str) {
	out datastore.accounts.{aid}(curName: Str, changeName(newName)) = newName
}

channel setTarget {
	out variables.a.target(curTarget: Str, setTarget(newTarget: Str)) = newTarget
}

channel setSource {
	out variables.a.source(curSource: Str, setSource(newSource: str)) = newSource
}

channel setTargetB {
	out variables.b.target(curTarget: Str, setTarget(newTarget: Str)) = newTarget
}

channel setSourceB {
	out variables.b.source(curSource: Str, setSource(newSource: str)) = newSource
}

channel setValue {
	in variables.a.source(curSource: Str, setValue(nextSource, nextName)) = nextSource
	in datastore.accounts.{nextSource}(curName, setValue(nextSource, nextName)) = nextName
	out variables.a.value(curValue: Str, setValue(nextSource, nextName)) = nextName
}

channel setButtonText {
	in variables.a.target(curTarget: Str, setButtonText(nextTarget, nextText)) = nextTarget
	in variables.a.value(curText: Str, setButtonText(nextTarget, nextText)) = nextText
	out screen.widgets.{nextTarget}.text(curText, setButtonText(nextTarget, nextText)) = nextText
}

channel setInputTextValue { 
	in variables.b.source(curSource: Str, setValue2(nextSource, nextTarget, nextValue)) = nextSource
	in variables.b.target(curTarget: Str, setValue2(nextTarget, nextTarget, nextValue)) = nextTarget
	in screen.widgets.{nextSource}.text(curValue: Str, setValue2(nextSource, nextTarget, nextValue)) = nextValue
	out screen.widgets.{nextTarget}.text(curText, setValue2(nextTarget, nextTarget, nextValue)) = nextValue
}
