Estoy escribiendo un editor gráfico para un "modelo" (es decir, una colección de cajas y líneas con algún tipo de semántica, como UML, los detalles de los cuales no importan aquí) . Así que quiero tener una estructura de datos que represente el modelo, y un diagrama donde una edición del diagrama cause un cambio correspondiente en el modelo. Entonces, si, por ejemplo, un elemento modelo tiene texto en un atributo y edito el texto en el diagrama, quiero que el elemento modelo se actualice.Cremallera estructura de datos para editor de modelo gráfico
El modelo probablemente se representará como un árbol, pero quiero que el editor de diagramas sepa tan poco sobre la representación del modelo como sea posible. (Estoy usando el marco diagrams, por lo que asociar información arbitraria con un elemento gráfico es fácil). Probablemente habrá una clase "modelo" para codificar la interfaz, si puedo descubrir qué debería ser.
Si estuviera haciendo esto en un lenguaje imperativo, sería sencillo: me gustaría tener una referencia del elemento gráfico en el diagrama de nuevo al elemento del modelo. En teoría, podría hacer esto construyendo el modelo a partir de una colección masiva de IORefs, pero eso sería escribir un programa Java en Haskell.
Claramente, cada elemento gráfico va a tener algún tipo de cookie asociada que permitirá la actualización del modelo. Una respuesta simple sería darle a cada elemento del modelo un identificador único y almacenar el modelo en una tabla de búsqueda de Data.Map. Pero eso requiere una importante contabilidad para garantizar que no haya dos elementos del modelo que tengan el mismo identificador. También me parece una solución "stringly typed"; tiene que manejar los casos en los que se borra un objeto, pero hay una referencia a él en otro lugar, y es difícil decir algo sobre la estructura interna del modelo en sus tipos.
Por otro lado Oleg's writings sobre cremalleras con múltiples orificios y cursores con claro intercambio transaccional suena como una mejor opción, si tan solo pudiera entenderlo. Obtengo la idea básica de cremalleras de lista y árbol y la diferenciación de una estructura de datos. ¿Sería posible que cada elemento de un diagrama mantenga un cursor en una cremallera del modelo? ¿De modo que si se realiza un cambio, se puede asignar a todos los demás cursores? ¿Incluidas las operaciones de árbol (como mover un subárbol de un lugar a otro)?
Me sería particularmente útil en este punto si hubiera algún tipo de tutorial sobre continuaciones delimitadas, y una explicación de cómo hacen que funcionen las cremalleras con múltiples cursores de Oleg, ¿eso es un poco menos pronunciado que las publicaciones de Oleg?
¿Tal vez el blog de Chung-chieh Shan? : http://conway.rutgers.edu/~ccshan/wiki/blog/posts/WalkZip1/. Tenga en cuenta que Blobs (wxHaskell) es una biblioteca para escribir "editores de red": probablemente se haya descompuesto, pero puede que sea menos trabajo actualizarlo que volver a comenzar con Diagramas. –
Gracias. Empecé a trabajar en eso. Te dejaré saber si te lleva a una respuesta. –