     {:houses (zipmap (range 1 13) (rest data))}
     {}))
 
+;; expects an atom map, key, and value to assoc
+;; returns the value for further use
+(defn- result [a k v]
+  (do (swap! a assoc k v)
+   v))
+
 (defn calc
   ([] (calc {}))
   ([stuff]
-   (let [sw (SwissEph.)
-         want (prepare stuff)
+   (let [want (merge defaults stuff)
+         re (atom {})
+         sw (SwissEph.)
+         jd (result re :jd (utc-to-jd (:utc want)))
          flag (. SweConst SEFLG_SPEED)]
     (merge
       {:points

                  res (double-array 6)
                  err (StringBuffer.)
                  rc (.swe_calc_ut sw
                                   (:jd want)
                                   what
                                   flag
                                   res

          (merge
            (nice-angles ascmc (:angles want))
            (nice-houses cusps (:houses want)))))
      (if (:meta want) {:wanted (dissoc want :meta)
                        :result @re})))))
