chromium/third_party/blink/perf_tests/speedometer20/resources/todomvc/vanilla-examples/es2015-babel-webpack/src/todo.js

import View from './view'
import Controller from './controller'
import Model from './model'
import Store from './store'
import Template from './template'
import {remove} from './helpers'

export {updateTodo, getTodo, subscribe}

let todo
const subscribers = []

/**
 * Sets up a brand new Todo list.
 *
 * @param {string} name The name of your new to do list.
 */
function Todo(name) {
  this.storage = new Store(name)
  this.model = new Model(this.storage)
  this.template = new Template()
  this.view = new View(this.template)
  this.controller = new Controller(this.model, this.view)
}

function updateTodo() {
  todo = new Todo('todos-vanillajs')
  todo.controller.setView(document.location.hash)
  subscribers.forEach(s => s())
}

function getTodo() {
  return todo
}

function subscribe(cb) {
  subscribers.push(cb)
  return function unsubscribe() {
    remove(subscribers, cb)
  }
}