9

Je recherche une bibliothèque fonctionnelle avec des structures de données persistantes. J'ai seulement besoin de tableaux et de dictionnaires imbriqués. Il y a quelques functional javascript libraries, mais ils ne sont pas orientés vers l'immuabilité. Je veux être capable d'écrireBibliothèque fonctionnelle Javascript avec structures de données persistantes

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 

Alors que underscore se rapproche, dans certains cas, en particulier avec les tableaux, il modifie les arguments du dictionnaire. Je pourrais aussi utiliser clojurescript, mais je préférerais une approche plus légère.

+2

@FlavioCysne Je viens d'avoir un coup d'oeil et ne peut pas voir comment il est lié à ma question. –

+0

juste pour clarifier (parce que je travaille actuellement sur quelque chose de très similaire), avez-vous besoin de la carte persistante résultant se comporter comme un objet natif, y compris "." accès? Cela nécessiterait soit de simuler en utilisant des getters, soit de copier toute la structure à partir de la modification et la geler, ce qui pour les grandes cartes plates devient inefficace assez rapidement (et les deux nécessitent ES5) ... ou bien êtes-vous satisfait des fonctions/méthodes accédant au contenu (mon approche)? –

+0

Je serais plus heureux avec la solution d'accès doc, voir ses inconvénients, cependant. Je n'ai pas d'énormes cartes de toute façon. L'exigence ES5 ... eh bien, je vais réfléchir à votre approche d'accès aux fonctions. –

Répondre

3

J'ai finalisé mon implémentation de Persistent Map (et je terminerai Persistent Vector bientôt) pour JavaScript, car il semble y avoir une demande croissante.

Il existe plusieurs détails comparés, par ex. Java (manque d'égaux, hashCode sur lequel s'appuyer), donc l'implémentation utilise l'arbre binaire équilibré trié (l'équilibrage est réellement simplifié et accéléré par l'immuabilité) et === pour l'égalité et < ou la fonction personnalisée pour plus bas que.

le code de Feat.js (le nom de code du projet) est disponible à feat-sorted-map.js at github.com

Vous pouvez voir une page avec des tests de travail en action en ligne à feat.js at cofylang.org

Actuellement, il n'y a pas de documentation, sauf la source le code et les tests, mais je travaille aussi sur la finition.

Mise à jour: Il existe également une implémentation d'un vecteur persistant disponible ici, et la vitesse a été améliorée en ordres de grandeur. (Il a été assaini ainsi) feat-vector.js at github.com

+1

On dirait impressionnant, merci @jJ ' –

+0

J'aime la petite taille du code. –

+0

@jJ, qu'avez-vous fait pour l'accélérer? – Scott

8

Je jetterai un coup d'oeil à Mori. Il empaquette la structure de données fonctionnelle de ClojureScript pour une utilisation à partir de Javascript ancien. Puisque les structures de données proviennent de ClojureScript, je m'attendrais à ce qu'elles soient mieux testées, plus complètes et plus performantes que les autres bibliothèques.

https://github.com/swannodette/mori

Questions connexes