The point of `no-local-state-methods` is to permit full application snapshotting w/o changing any other semantics. That is, you should otherwise end up with equivalent Om programs.
This is not going to change. David On Sat, Jan 31, 2015 at 11:52 AM, stephanos <[email protected]> wrote: > Just to be clear, I'm not talking about the default/general local state > semantics, but the 'no-local-state-methods' semantics. Since the sole > purpose of this function is to handle loading/saving local state from/to > global state - why not make it work for initialising as well? > > Initially I expected it to work this way, using the local state inside the > global state and applying the init-state data as defaults. > > Stephan > > On Saturday, January 31, 2015 at 5:20:59 PM UTC+1, David Nolen wrote: > > We're not going to change local state semantics. You will need to > consider alternative strategies. > > > > On Saturday, January 31, 2015, stephanos <[email protected]> wrote: > > Now there is still one problem. > > > > > > > > If the database is filled with data already (e.g. when loading data from > localstorage into it upon page refresh), it is overridden by Om since it > calls 'init-state' and uses swap! + assoc to put the database in the global > state. > > > > > > > > @David Would it make sense to use 'merge' instead? In order to respect > the data that exists prior to the first 'init-state' call? > > > > > > > > Stephan > > > > > > > > > > > > On Saturday, January 31, 2015 at 4:39:45 PM UTC+1, stephanos wrote: > > > > > Okay, I finally made it. Here is the implementation: > > > > > > > > > > (defn- read-map > > > > > [db] > > > > > (or (first (d/q '[:find ?e ?v :in :where [?e :map ?v]] db)) [nil > nil])) > > > > > > > > > > (defn- write-map > > > > > [conn fn] > > > > > (let [[old-id old-val] (read-map @conn) > > > > > new-id (if old-id {:db/id old-id} {}) > > > > > new-val (or (fn (or old-val {})) {})] > > > > > (d/transact! conn [(merge new-id {:map new-val})]))) > > > > > > > > > > (deftype DatabaseWrapper [db] > > > > > IDeref > > > > > (-deref [_] > > > > > db) > > > > > ILookup > > > > > (-lookup [this k] > > > > > (-lookup this k nil)) > > > > > (-lookup [_ k not-found] > > > > > (let [[_ map] (read-map db)] > > > > > (if (nil? k) > > > > > map > > > > > (or (get map k) not-found))))) > > > > > > > > > > (deftype DatabaseCursor [conn] > > > > > IAtom > > > > > IDeref > > > > > (-deref [_] > > > > > (DatabaseWrapper. @conn)) > > > > > ILookup > > > > > (-lookup [this k] > > > > > (-lookup this k nil)) > > > > > (-lookup [this k not-found] > > > > > (-lookup @this k not-found)) > > > > > IAssociative > > > > > (-contains-key? [this k] > > > > > (not (= (-lookup this k ::not-found) ::not-found))) > > > > > (-assoc [this k v] > > > > > (write-map conn #(assoc % k v)) > > > > > this) > > > > > IMap > > > > > (-dissoc [this k] > > > > > (write-map conn #(dissoc % k)) > > > > > this) > > > > > ICloneable > > > > > (-clone [this] > > > > > this) > > > > > IHash > > > > > (-hash [_] > > > > > (hash @conn)) > > > > > ISwap > > > > > (-swap! [_ fn] > > > > > (write-map conn #(fn %))) > > > > > (-swap! [_ fn x] > > > > > (write-map conn #(fn % x))) > > > > > (-swap! [_ fn x y] > > > > > (write-map conn #(fn % x y))) > > > > > (-swap! [_ fn x y xs] > > > > > (write-map conn #(fn % x y xs))) > > > > > IMeta > > > > > (-meta [_] > > > > > (meta conn)) > > > > > om/ITransact > > > > > (-transact! [_ _ _ _] > > > > > (throw js/Error "not supported")) > > > > > om/IValue > > > > > (-value [_] > > > > > @conn) > > > > > om/ICursor > > > > > (-path [_] > > > > > []) > > > > > (-state [_] > > > > > nil) > > > > > IEquiv > > > > > (-equiv [_ other] > > > > > (if (instance? DatabaseCursor other) > > > > > (= @conn @@other) > > > > > (= @conn other))) > > > > > IWatchable > > > > > (-notify-watches [_ oldval newval] > > > > > (-notify-watches conn oldval newval)) > > > > > (-add-watch [_ key f] > > > > > (-add-watch conn key f)) > > > > > (-remove-watch [_ key] > > > > > (-remove-watch conn key)) > > > > > IPrintWithWriter > > > > > (-pr-writer [_ writer opts] > > > > > (-pr-writer @conn writer opts))) > > > > > > > > > > A new cursor can be simple created with > > > > > > > > > > (DatabaseCursor. (d/create-conn {})) > > > > > > > > > > Now when you enable instrumentation > > > > > > > > > > (defn- instrument > > > > > [f cursor m] > > > > > (let [custom-opts (assoc m :descriptor (om/no-local-descriptor > om/no-local-state-methods))] > > > > > (om/build* f cursor custom-opts))) > > > > > > > > > > local state will be saved to the DataScript db. > > > > > > > > > > Stephan > > > > > > > > > > On Sunday, January 25, 2015 at 11:09:25 AM UTC+1, stephanos 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.
