   (if (seq korks)
     delta
     [op new-val]))
+
+;; Creating deltas
+(defn negative-diagnostic-deltas
+  "Convert a map to negative diagnostic deltas."
+  [m]
+  (let [step (fn step [root-ks [ks v]]
+               (let [full-ks (into root-ks ks)]
+                 (cond (map? v)
+                       (mapcat (partial step full-ks) v)
+
+                       (sequential? v)
+                       [[:ex full-ks v]]
+
+                       :else
+                       [[:ex (pop full-ks) (peek full-ks)]])))]
+    (mapcat (partial step []) (flatten-keys m))))
+
+(defn negative-deltas
+  "Convert a map to positive summable deltas."
+  [m]
+  (->> m
+       negative-diagnostic-deltas
+       (map summable-delta)))
+
+(defn positive-diagnostic-deltas
+  "Convert a map to positive diagnostic deltas."
+  [m]
+  (let [step (fn step [root-ks [ks v]]
+               (let [full-ks (into root-ks ks)]
+                 (cond (map? v)
+                       (mapcat (partial step full-ks) v)
+
+                       (coll? v)
+                       [[:in full-ks v]]
+
+                       :else
+                       [[:is full-ks v]])))]
+    (mapcat (partial step []) (flatten-keys m))))
+
+(def ^{:arglists '([m])} positive-deltas
+  "Convert a map to positive summable deltas."
+  positive-diagnostic-deltas)
 
 ;; Transducers
 (defn nest

  "A stateful transducer that returns a new composite value for each
  delta going in."
  (results-skip-init add))

(ns commos.delta
  (:require [clojure.set :refer [difference]]
            [commos.shared.core :refer [flatten-keys]]))

(defn- collect
  [ks]
  (if (coll? ks) ks [ks]))

;; Helpers on deltas
(defn pack
