Рекурсивность

Алгоритмы поиска целевого слоя

Алгоритм поиска источника сигналов

Универсальный алгоритм для поиска связанных юнитов, используется в двух ситуациях:

При императивных вызовах алгоритм отрабатывает один раз, после чего результат добавляется шаблон или вышележащий слой (пока не понятно куда именно)

Алгоритм поиска потребителей сигналов

Алгоритм, который определяет, куда должен распространяться сигнал после выполнения ноды, опирается на результаты работы алгоритма поиска источника сигналов, должен быть максимально легковесным

Переходы в моделях отличаются от обычных связей через next в нодах, оптимальнее всего определять это через флаг в ноде, который бы показывал ядру, что для запуска ноды необходимо выполнить алгоритм поиска потребителей сигнала, тогда реализация будет прозрачной для пользователей ядра, например даже императивное добавление ноды в next будет приводить к активации алгоритма

Структуры данных шаблона и инстанса

const rootModel = model({
  props: {},
  create() {
    const incCountAll = createEvent()
    const $countAll = createStore(0)
    $countAll.on(incCountAll, x => x + 1)

    const childModel = model({
      props: {},
      create() {
        const incCountParent = createEvent()
        const incCount = createEvent()
        const $count = createStore(0)
        const $countSum = combine($count, $countAll, (x, y) => x + y)

		$count.on(incCount, x => x + 1)
        sample({clock: incCountParent, target: incCountAll})
      }
    })
  }
})

childModel:

stores:
  $count: 'same'
  $countSum: 'same'
  $countAll: rootModel
actions:
  incCountParent: 'same'
  incCount: 'same'
  incCountAll: rootModel
targets:

const fieldModel = model({
  props: {
    value: '',
    validate: createEvent()
  },
  create({value, validate}) {
    const $isDirty = createStore(false)
    const $fullValue = combine(
      value,
      (val) => val.trim()
    )
    const $isValid = createStore(true)
    sample({
      clock: validate,
      source: $fullValue,
      fn: () => true,
      target: $isValid,
    })
  }
})

const formModel = model({
  props: {},
  create() {
    const validateEmail = createEvent()
    const $username = createStore('')
    const username = spawn(fieldModel, {value: $username})
    const email = spawn(fieldModel, {
      validate: validateEmail
    })
  }
})
fieldModel:
  stores:
    value: 'same'
    $isDirty: 'same'
    $fullValue: 'same'
    $isValid: 'same'
  actions:
    validate: 'same'
formModel:
  stores:
    $username: 'same'
  actions:
    validateEmail: 'same'
  instances:
    username: fieldModel
    email: fieldModel
  targets:
    $username:
      - 'username.value'
    validateEmail:
      - 'email.validate'
  fills:
    $username:
      - 'username.value'

Возможно, должна быть разница в том, как хранятся и обрабатываются статичные и динамичные инстансы