J'écris un éditeur graphique pour un "modèle" (c'est-à-dire une collection de boîtes et de lignes avec une sorte de sémantique, comme UML, dont les détails n'ont pas d'importance ici) . Je veux donc avoir une structure de données représentant le modèle, et un diagramme où une modification apportée au diagramme provoque une modification correspondante dans le modèle. Donc, si, par exemple, un élément de modèle a du texte dans un attribut et que je modifie le texte dans le diagramme, je veux que l'élément de modèle soit mis à jour.Structure de données Zipper pour éditeur de modèle graphique
Le modèle sera probablement représenté sous forme d'arborescence, mais je souhaite que l'éditeur de diagramme en sache le moins possible sur la représentation du modèle. (J'utilise le framework diagrams, donc l'association d'informations arbitraires avec un élément graphique est facile). Il y aura probablement une classe "model" pour encoder l'interface, si je peux juste comprendre ce que cela devrait être. Si je faisais cela dans un langage impératif, ce serait simple: je voudrais juste avoir une référence de l'élément graphique dans le diagramme à l'élément de modèle. En théorie, je pourrais encore le faire en construisant le modèle à partir d'une collection massive de IORefs, mais cela serait l'écriture d'un programme Java dans Haskell. De toute évidence, chaque élément graphique doit être associé à un cookie qui lui permettra d'effectuer la mise à jour du modèle. Une réponse simple serait de donner à chaque élément de modèle un identifiant unique et de stocker le modèle dans une table de recherche Data.Map. Mais cela nécessite une comptabilité importante pour s'assurer qu'aucun élément du modèle ne reçoive le même identifiant. Cela me semble également être une solution "stringly typed"; vous devez gérer les cas où un objet est supprimé mais il y a une référence qui se balade ailleurs, et il est difficile de dire quoi que ce soit sur la structure interne du modèle dans vos types.
D'autre part Oleg's writings sur les fermetures à glissière avec des trous multiples et des curseurs avec le partage transactionnel clair semble être une meilleure option, si seulement je pouvais le comprendre. J'ai l'idée de base des fermetures à glissière de liste et d'arbre et de la différenciation d'une structure de données. Serait-il possible pour chaque élément d'un diagramme de contenir un curseur dans une fermeture à glissière du modèle? Alors que si un changement est fait, il peut alors être engagé à tous les autres curseurs? Y compris les opérations arborescentes (telles que le déplacement d'un sous-arbre d'un endroit à un autre)? Cela m'aiderait particulièrement s'il existait une sorte de tutoriel sur les continuations délimitées, et une explication de la façon dont fonctionnent les fermetures multi-curseurs d'Oleg, un peu moins abruptes que les publications d'Oleg?
Peut-être le blog de Chung-chieh Shan? : http://conway.rutgers.edu/~ccshan/wiki/blog/posts/WalkZip1/. Notez, Blobs (wxHaskell) est une bibliothèque pour écrire des "éditeurs de réseau" - il a probablement pourri mais il peut être moins de travail pour le mettre à jour que de recommencer avec Diagrams. –
Merci. J'ai commencé à travailler dessus. Je vous ferai savoir si cela mène à une réponse. –