P.S. This is a question about clarification/advice, not a critique to Clojure, as it actually works as advertised :)
On Tuesday, January 15, 2019 at 2:58:07 PM UTC+1, plamen...@gmail.com wrote: > > Hello all > > while working on a daily basis where I use Clojure's native vectors/maps I > almost never experience the problem and even if - it is easy fixable with > something like (into [] ...), I have the following problem with custom data > structures and ask here for clarification if my understanding is correct. > > Imagine I try on the one side to represent something like a database table > in memory, while on the other to make it pluggable into all meaningful > sequence and vector/map functions in Clojure. In the most naive > implementation a table is a vector of maps. If i would like to add more > functionality, while trying to remain transparent to Clojure functions I > could implement a custom Record type (IPersistentMap etc.) for the rows > (for a custom storage, for column ordering, type checking etc.) and this > works. I could also implement a custom Table (IPersistentVector etc.) for > the actual collection of records while maintaining internally some indexes, > the schema of the table etc. The point is that if possible to apply let say > (filter.. or (take 2 ..., (sort .. incl. define/apply transducers. or > whatever other Clojure function compatible with these interfaces on the > Table/IPersistentVector/IPersistentCollection and get back a Table. > > What I know: > 1. Clojure's doc actually says that sequence functions return sequences > and say nothing about preserving the original type, the implementations of > the sequence functions do actually as advertised and return usually Cons-es. > 2. monads, yes, but the point is not to force the user to use custom > functions instead of the built in ones. > 3. IPersistentCollection has first/next/more methods which could return a > Table instead of a Record or a collection of them. > 4. IPersistentVector has a cons method, but it is used by Clojure's conj > for example, but not inside the implementations of filter/take etc. which > create actual Cons objects > 5. I could attach table like descriptions to each Record object (be it in > its metadata or else), but then enforcing that all Records share the same > Table data could get penalizing at runtime. > 6. I know how Incanter and core.matrix try to solve some similar problems. > 7. there are some vector functions which return actual vectors back (like > filterv, mapv), but also not the original collection type. > > > So - do I miss something either in my knowledge or in the Clojure's > documentation/implementation and is there a meaningful way to apply > Clojure's and not mine filter/map/take/drop/sort etc. functions on a Table > and to get a Table back, without going the monads/own functions for > everything route or should I take it for granted that I can implement some > custom types, but no way to get them be fully transparent to Clojure? > > With best regards > Plamen > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.