@composi/runtime:

Inmutabilidad

El Estado de un Program es Mutable

Por defecto, el estado de un programa es mutable cuando tienes acceso a él, tanto dentro de los métodos de update y view. Por otro lado, la función update es cómo modificas el estado de un programa. Para ejemplos simples, esto probablemente no será un problema. Al menos puedes usar la destructuración para create una copia somera del estado del programa, cómo en el ejemplo siguiente.

function actions(estaado, mensaje) {
  // Clonar el estado por medio de la destructración:
  const estadoPrevio = {...estaado}
  return mensaje.match(mensaje, {
    // Chequear el mensaje de la etiqueta:
    'addItem': valor => {
      estadoPrevio.frutas.push({ key: estadoPrevio.newKey++, valor })
      // Renderizar la vista y actualizar el program al devolver el estado clonado:
      return estadoPrevio
    },
    // CChequear el mensaje de la etiqueta:
    'deleteItem': key => {
      estadoPrevio.frutas = estadoPrevio.frutas.filter(item => item.key != key)
      // Renderizar la vista y actualizar el program al devolver el estado clonado:
      return estadoPrevio
    }
  })
}

Clon Profundo

Si el app y sus datos son complejos, a lo mejor vas a tener que creatr una copia profunda de los datos. Puedes realizar ésto dentro de la función update así cómo hicimos con la destructuración previamente. Sólo hay que importarlo de @composi/clone:

import { h, render, run, union } from '@composi/core'
import { clone } from '@composi/clone'

function acciones(estado, msj) {
  // Clonar el estado:
  const estadoPrevio = clone(estado)
  return Msj.match(msj, {
    // Chequear la etiqueta del mensaje:
    'añadirÍtem': value => {
      estadoPrevio.frutas.push({ key: estadoPrevio.newKey++, value })
      // Renderizar la vista y actualizar el estado del programa:
      return estadoPrevio
    },
    // Chequear la etiqueta del mensaje:
    'eliminarÍtem': key => {
      estadoPrevio.frutas = estadoPrevio.frutas.filter(item => item.key != key)
      // Renderizar la vista y actualizar el estado del programa:
      return estadoPrevio
    }
  })
}

Por usar el técnico anterior de clonar el estado con clone, el programa no se actualizará hasta que el programa devuelva el estado clonado.