+function UI() {
+ const undoLog: string[] = [];
+ function perform(forward: string, reverse: string) {
+ undoLog.push(reverse);
+ return log.recordAndApply(`${clock.now()} ${forward}`);
+ }
+ return {
+ addTask: function (description: string): Element {
+ const now = clock.now();
+ undoLog.push(`State ${now} deleted`);
+ return <Element>log.recordAndApply(`${now} Create ${description}`);
+ },
+ addTag: function (createTimestamp: string, tag: string) {
+ return perform(`Tag ${createTimestamp} ${tag}`, `Untag ${createTimestamp} ${tag}`);
+ },
+ edit: function (createTimestamp: string, newDescription: string, oldDescription: string) {
+ return perform(`Edit ${createTimestamp} ${newDescription}`, `Edit ${createTimestamp} ${oldDescription}`);
+ },
+ removeTag: function (createTimestamp: string, tag: string) {
+ return perform(`Untag ${createTimestamp} ${tag}`, `Tag ${createTimestamp} ${tag}`);
+ },
+ setPriority: function (createTimestamp: string, newPriority: number, oldPriority: number) {
+ return perform(`Priority ${createTimestamp} ${newPriority}`, `Priority ${createTimestamp} ${oldPriority}`);
+ },
+ setState: function (createTimestamp: string, newState: string, oldState: string) {
+ return perform(`State ${createTimestamp} ${newState}`, `State ${createTimestamp} ${oldState}`);
+ },
+ undo: function () {
+ if (undoLog.length > 0) {
+ return log.recordAndApply(`${clock.now()} ${undoLog.pop()}`);
+ }
+ },
+ };
+}
+const ui = UI();