/*
 * Verrückte Turing-Maschinen — A turing complete game
 * Copyright (C) 2016-2018 kcf <vidofnir@folksprak.org>
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

namespace mod_vtm
	{
		
		export namespace mod_manifestation
			{
				
				/**
				 * @author kcf <vidofnir@folksprak.org>
				 */
				export type type_manifestation<type_model> = lib_call.type_complex<any>;
				
				
				/**
				 * @author kcf <vidofnir@folksprak.org>
				 */
				export type signature_manifestation<type_model, type_ausgabe> =
					{
						view : (manifestation : type_manifestation<type_model>)=>type_ausgabe;
						bind : (manifestation : type_manifestation<type_model>)=>void;
					}
				;
				
				
				/**
				 * @author kcf <vidofnir@folksprak.org>
				 */
				export var trait_manifestation : lib_trait.type_trait<signature_manifestation<any, any>> = lib_trait.create<signature_manifestation<any, any>>();
				
				
				/**
				 * @author kcf <vidofnir@folksprak.org>
				 */
				export function view<type_model, type_ausgabe>
					(
						manifestation : type_manifestation<type_model>
					)
					: type_ausgabe
					{
						return lib_trait.deploy(trait_manifestation, manifestation.kind)["view"](manifestation);
					}
				
				
				/**
				 * @author kcf <vidofnir@folksprak.org>
				 */
				export function bind<type_model, type_ausgabe>
					(
						manifestation : type_manifestation<type_model>
					)
					: void
					{
						return lib_trait.deploy(trait_manifestation, manifestation.kind)["bind"](manifestation);
					}
				
				
				/**
				 * @author kcf <vidofnir@folksprak.org>
				 */
				export function setup<type_model, type_ausgabe>
					(
						manifestation : type_manifestation<type_model>
					)
					: void
					{
						view<type_model, type_ausgabe>(manifestation);
						bind<type_model, type_ausgabe>(manifestation);
					}
				
			}
		
	}

