Thanks David, I'll spend more time with the source code and the debugger. And 
report back.

Stephan

On Sunday, January 25, 2015 at 4:07:26 PM UTC+1, David Nolen wrote:
> Om does not require cursors to render anything. This has been the case for 
> quite some time. Re-rendering is triggered by the following series of 
> conditionals:
> 
> 
> https://github.com/swannodette/om/blob/master/src/om/core.cljs#L309
> 
> 
> The first one works for any values, it's just an equality check.
> 
> 
> I don't really have much to suggest other than if you're going to go down 
> this path you going to have to familiarize yourself with the Om source code 
> by reading it and debugging your cursor implementation through source mapping 
> and stepping through Om execution.
> 
> 
> 
> David
> 
> 
> On Sun, Jan 25, 2015 at 9:56 AM, stephanos <[email protected]> wrote:
> Sorry, I'm not getting it. This
> 
> 
> 
>     ;; prevent cursor-ification
> 
>    (extend-type d/DB
> 
>      om/IToCursor
> 
>      (-to-cursor
> 
>        ([this _] this)
> 
>        ([this _ _] this)))
> 
> 
> 
> does also not implement ICursor, but it works (ie re-renders) anyway. What 
> makes Om re-render the view after I call d/transact! on the database that I 
> pass in as the root state?
> 
> 
> 
> Stephan
> 
> 
> 
> On Sunday, January 25, 2015 at 3:51:55 PM UTC+1, David Nolen wrote:
> 
> > You have not implemented ICursor. Just implementing IToCursor is not enough.
> 
> >
> 
> >
> 
> 
> 
> > On Sun, Jan 25, 2015 at 9:45 AM, stephanos <[email protected]> wrote:
> 
> > First of all, thanks for taking the time to reply.
> 
> >
> 
> >
> 
> >
> 
> > Okay, maybe DatabaseCursor is the wrong name, DatabaseWrapper then.
> 
> >
> 
> >
> 
> >
> 
> > When I use this
> 
> >
> 
> >
> 
> >
> 
> >    ;; prevent cursor-ification
> 
> >
> 
> >    (extend-type d/DB
> 
> >
> 
> >      om/IToCursor
> 
> >
> 
> >      (-to-cursor
> 
> >
> 
> >        ([this _] this)
> 
> >
> 
> >        ([this _ _] this)))
> 
> >
> 
> >
> 
> >
> 
> > it's preventing Om to turn d/DB into some kind of cursor. But when a change 
> > is made to the database, Om re-renders the view. How does it figure that 
> > out?
> 
> >
> 
> >
> 
> >
> 
> > When I pass my custom DatabaseWrapper, which implements IAssociative and 
> > ILookup as well as om/IToCursor - it is not re-rendered anymore (I couldn't 
> > extend d/DB directly, it caused DataScript internal issues). I also tried 
> > implementing ICursor instead of IToCursor, but none of the methods were 
> > ever called.
> 
> >
> 
> >
> 
> >
> 
> > So how can I have a wrapper of a DataScript database that supports 
> > IAssociative and still make Om re-render after any change to it? What's 
> > missing?
> 
> >
> 
> >
> 
> >
> 
> > Stephan
> 
> >
> 
> >
> 
> >
> 
> >
> 
> >
> 
> > On Sunday, January 25, 2015 at 3:29:33 PM UTC+1, David Nolen wrote:
> 
> >
> 
> > > This won't be considered a cursor since it does not implement ICursor.
> 
> >
> 
> > >
> 
> >
> 
> > >
> 
> >
> 
> > > David
> 
> >
> 
> > >
> 
> >
> 
> > >
> 
> >
> 
> >
> 
> >
> 
> > > On Sun, Jan 25, 2015 at 5:09 AM, stephanos <[email protected]> wrote:
> 
> >
> 
> > > Hey there,
> 
> >
> 
> > >
> 
> >
> 
> > >
> 
> >
> 
> > >
> 
> >
> 
> > > I'm trying to integrate Om and DataScript.
> 
> >
> 
> > >
> 
> >
> 
> > >
> 
> >
> 
> > >
> 
> >
> 
> > > At first I used David Nolen's gist [1] that implements 'om/IToCursor' for 
> > > DataScript's DB type. That worked out well for some time. But now I try 
> > > to apply Om's experimental support for writing all local state into the 
> > > app state [2]. This requires an associative data structure because of its 
> > > use of 'assoc' and 'get-in'.
> 
> >
> 
> > >
> 
> >
> 
> > >
> 
> >
> 
> > >
> 
> >
> 
> > > So I attempted to write a wrapper around the DataScript DB atom, 
> > > DatabaseCursor. Now, while I succeeded in saving the local state to it by 
> > > implementing IAssociative and ILookup, the app does not re-render on 
> > > change anymore :(
> 
> >
> 
> > >
> 
> >
> 
> > >
> 
> >
> 
> > >
> 
> >
> 
> > > I originally assumed all I needed was to implement the IEquiv or IHash 
> > > protocol, but that does not seem to work (both are never called). So I'm 
> > > stuck right now. Here is my DatabaseCursor:
> 
> >
> 
> > >
> 
> >
> 
> > >
> 
> >
> 
> > >
> 
> >
> 
> > >   (deftype DatabaseCursor [conn]
> 
> >
> 
> > >
> 
> >
> 
> > >     ILookup
> 
> >
> 
> > >
> 
> >
> 
> > >     (-lookup [this k]
> 
> >
> 
> > >
> 
> >
> 
> > >       (-lookup this k nil))
> 
> >
> 
> > >
> 
> >
> 
> > >     (-lookup [_ k not-found]
> 
> >
> 
> > >
> 
> >
> 
> > >       (let [v (ffirst (d/q '[:find ?v :in $ ?k :where [?e :key ?k] [?e 
> > > :value ?v]] @conn k))]
> 
> >
> 
> > >
> 
> >
> 
> > >         (or v not-found)))
> 
> >
> 
> > >
> 
> >
> 
> > >     IAssociative
> 
> >
> 
> > >
> 
> >
> 
> > >     (-contains-key? [_ k]
> 
> >
> 
> > >
> 
> >
> 
> > >       (not (empty? (d/q '[:find ?e :in $ ?k :where [?e :key ?k]] @conn 
> > > k))))
> 
> >
> 
> > >
> 
> >
> 
> > >     (-assoc [this k v]
> 
> >
> 
> > >
> 
> >
> 
> > >       (let [old-id (ffirst (d/q '[:find ?e :in $ ?k :where [?e :key ?k]] 
> > > @conn k))
> 
> >
> 
> > >
> 
> >
> 
> > >             new-id (if old-id {:db/id old-id} {})]
> 
> >
> 
> > >
> 
> >
> 
> > >         (d/transact! conn [(merge new-id {:key k, :value v})]))
> 
> >
> 
> > >
> 
> >
> 
> > >       this)
> 
> >
> 
> > >
> 
> >
> 
> > >     om/IToCursor
> 
> >
> 
> > >
> 
> >
> 
> > >     (-to-cursor [this _] this)
> 
> >
> 
> > >
> 
> >
> 
> > >     (-to-cursor [this _ _] this))
> 
> >
> 
> > >
> 
> >
> 
> > >
> 
> >
> 
> > >
> 
> >
> 
> > > How to I need to modify my custom cursor to make Om aware of changes to 
> > > the DataScript DB?
> 
> >
> 
> > >
> 
> >
> 
> > >
> 
> >
> 
> > >
> 
> >
> 
> > > [1] https://gist.github.com/swannodette/11308901
> 
> >
> 
> > >
> 
> >
> 
> > > [2] 
> > > https://github.com/swannodette/om/commit/ee9d92bf1191a391df804c066868c8180f9d64cf
> 
> >
> 
> > >
> 
> >
> 
> > >
> 
> >
> 
> > >
> 
> >
> 
> > > --
> 
> >
> 
> > >
> 
> >
> 
> > > Note that posts from new members are moderated - please be patient with 
> > > your first post.
> 
> >
> 
> > >
> 
> >
> 
> > > ---
> 
> >
> 
> > >
> 
> >
> 
> > > You received this message because you are subscribed to the Google Groups 
> > > "ClojureScript" group.
> 
> >
> 
> > >
> 
> >
> 
> > > To unsubscribe from this group and stop receiving emails from it, send an 
> > > email to [email protected].
> 
> >
> 
> > >
> 
> >
> 
> > > To post to this group, send email to [email protected].
> 
> >
> 
> >
> 
> >
> 
> > >
> 
> >
> 
> > > Visit this group at http://groups.google.com/group/clojurescript.
> 
> >
> 
> >
> 
> >
> 
> > --
> 
> >
> 
> > Note that posts from new members are moderated - please be patient with 
> > your first post.
> 
> >
> 
> > ---
> 
> >
> 
> > You received this message because you are subscribed to the Google Groups 
> > "ClojureScript" group.
> 
> >
> 
> > To unsubscribe from this group and stop receiving emails from it, send an 
> > email to [email protected].
> 
> >
> 
> > To post to this group, send email to [email protected].
> 
> >
> 
> > Visit this group at http://groups.google.com/group/clojurescript.
> 
> 
> 
> --
> 
> Note that posts from new members are moderated - please be patient with your 
> first post.
> 
> ---
> 
> You received this message because you are subscribed to the Google Groups 
> "ClojureScript" group.
> 
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> 
> To post to this group, send email to [email protected].
> 
> Visit this group at http://groups.google.com/group/clojurescript.

-- 
Note that posts from new members are moderated - please be patient with your 
first post.
--- 
You received this message because you are subscribed to the Google Groups 
"ClojureScript" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/clojurescript.

Reply via email to