9

Sto cercando una libreria funzionale con strutture dati persistenti. Ho solo bisogno di array e dizionari annidati. Ci sono alcuni functional javascript libraries, ma non sono orientati verso l'immutabilità. Voglio essere in grado di scrivereLibreria funzionale Javascript con strutture dati persistenti

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 

Mentre underscore si avvicina, in alcuni casi, in particolare con gli array, esso modifica gli argomenti del dizionario. Potrei anche usare clojurescript, ma preferirei un approccio più leggero.

+2

@FlavioCysne Ho appena dato un'occhiata a esso e non può vedere come è legato alla mia domanda. –

+0

solo per chiarire (perché attualmente sto lavorando a qualcosa di molto simile), hai bisogno che la risultante mappa persistente si comporti come un oggetto nativo che include "." accesso? Ciò richiederebbe simulare l'uso di getter o copiare l'intera struttura dalla modifica verso l'alto e congelarla, che per le grandi mappe piane diventa inefficiente abbastanza rapidamente (ed entrambi richiedono ES5) ... o stai bene con funzioni/metodi che accedono al contenuto (il mio approccio)? –

+0

Sarei più felice con la soluzione di accesso ai documenti, tuttavia vedendo i suoi inconvenienti. Comunque non ho mappe enormi. Il requisito ES5 ... beh, rifletterò sul tuo approccio di accesso alle funzioni. –

risposta

3

Ho finalizzato la mia implementazione di Persistent Map (e presto finirà Persistent Vector) per JavaScript, perché sembra esserci una domanda crescente.

Ci sono diverse specifiche rispetto ad es. Java (mancanza di eguali, hashCode su cui fare affidamento), quindi l'implementazione utilizza un albero binario bilanciato ordinato (il bilanciamento è in realtà semplificato e velocizzato dall'immutabilità) e === per l'uguaglianza e < o la funzione personalizzata per minore di.

il codice di Feat.js (il nome in codice del progetto) è disponibile presso feat-sorted-map.js at github.com

Si può vedere una pagina con le prove di lavoro in azione online in feat.js at cofylang.org

Attualmente, non v'è alcuna documentazione tranne la fonte codice e test, ma sto lavorando per finire anche quello.

Aggiornamento: c'è un'implementazione di un vettore persistente disponibile anche lì, e la velocità è stata migliorata in ordini di grandezza. (È stato ripulito pure) feat-vector.js at github.com

+1

Sembra impressionante, grazie @jJ ' –

+0

Mi piace quanto sia piccolo il codice. –

+0

@jJ, cosa hai fatto per velocizzarlo? – Scott

8

Darei un'occhiata a Mori. Implica la struttura dei dati funzionali di ClojureScript per l'utilizzo da vecchio Javascript semplice. Dal momento che le strutture dati provengono da ClojureScript, mi aspetto che siano meglio testate, più complete e più performanti rispetto ad altre librerie.

https://github.com/swannodette/mori