9

Estoy buscando una biblioteca funcional con estructuras de datos persistentes. Solo necesito matrices y diccionarios anidados. Hay algunos functional javascript libraries, pero no están orientados a la inmutabilidad. Quiero ser capaz de escribirBiblioteca funcional Javascript con estructuras de datos persistentes

var dict = makeDictionary({ 
    'foo': 1; 
    'bar': { 
    'ely': 2; 
    } 
}); 
var newDict = dict.assoc('foo', 42).assoc('bar', 'tender', 30).dissoc('bar', 'ely'); 
assert.eq dict.bar.ely, 2; // unchanged 
assert.eq newDict.bar.tender, 30; // added 
assert.eq newDict.bar.ely, undefined; // removed 

Mientras underscore se acerca en algunos casos, especialmente con las matrices, modifica los argumentos de diccionario. También podría usar clojurescript, pero preferiría un enfoque más liviano.

+2

@FlavioCysne acabo de tener una mirada en ella y no se puede ver cómo se relaciona con mi pregunta. –

+0

solo para aclarar (porque actualmente estoy trabajando en algo bastante similar), ¿necesita que el mapa persistente resultante se comporte como un objeto nativo incluyendo "." ¿acceso? Eso requeriría simular el uso de captadores, o copiar toda la estructura de la modificación y congelarla, lo que para grandes mapas planos se vuelve ineficiente con bastante rapidez (y ambos requieren ES5) ... o está bien con las funciones/métodos que acceden al contenido (mi acercamiento)? –

+0

Estaría más feliz con la solución de acceso a documentos, sin embargo, viendo sus inconvenientes. No tengo mapas enormes de todos modos. El requisito de ES5 ... bueno, voy a pensar en tu enfoque de acceso a funciones. –

Respuesta

3

Finalicé mi implementación de Persistent Map (y finalizará Persistent Vector pronto) para JavaScript, porque parece que hay una demanda en aumento.

Hay varios detalles en comparación con, por ejemplo, Java (falta de iguales, código hash en el que confiar), por lo que la implementación utiliza un árbol binario equilibrado ordenado (el equilibrio se simplifica y acelera por inmutabilidad) y === para igualdad y < o función personalizada para menor que.

el código de Feat.js (el nombre en clave del proyecto) está disponible en feat-sorted-map.js at github.com

Se puede ver una página con las pruebas de trabajo en la acción en línea en feat.js at cofylang.org

Actualmente, no hay ninguna documentación, excepto la fuente código y pruebas, pero estoy trabajando en terminar eso también.

Actualización: hay una implementación de un vector persistente disponible allí también, y la velocidad se ha mejorado en órdenes de magnitud. (Se ha limpiado arriba también) feat-vector.js at github.com

+1

Parece impresionante, gracias @jJ ' –

+0

Me gusta lo pequeño que es el código. –

+0

@jJ, ¿qué hiciste para acelerarlo? – Scott

8

Echaré un vistazo a Mori. Se empaqueta la estructura de datos funcionales de ClojureScript para usar desde un simple Javascript antiguo. Dado que las estructuras de datos provienen de ClojureScript, espero que estén mejor probados, más completos y más efectivos que otras bibliotecas.

https://github.com/swannodette/mori

Cuestiones relacionadas