type Component := { render: (data: T) => VirtualDOMNode, compare?: (left: T, right: T) => Boolean, data?: T } type VirtualDOMNode := { properties: Object, tagName: String, childNodes: Array } type VirtualDOMTree := VirtualDOMNode | Component type DOMAttributeString := String type DOMAttributeValue := Any type DOMPatch := { path: Array, operation: 'attribute' | 'insert' | 'remove' key?: DOMAttributeString, value: VirtualDOMTree | DOMAttributeValue | null } virtual-dom/h := ( tagName: String, attrs?: Object, children?: Array ) => VirtualDOMTree virtual-dom/render := (tree: VirtualDOMTree) => DOMElement virtual-dom-diff := (left: VirtualDOMTree, right: VirtualDOMTree) => Array virtual-dom-batch := (patches: Array) => Array virtual-dom-patch := (elem: DOMElement, patches: Array) => void