From ca3929252ff41d2b87a5e47e5b2c2b57ac14b773 Mon Sep 17 00:00:00 2001
From: Paul Stadig <paul@stadig.name>
Date: Tue, 13 Dec 2011 22:14:20 +0000
Subject: [PATCH] Remove one layer of .cache in snapshot.

Makes snapshot compatible with implementations of CacheProtocol that do not have
a field named 'cache'.
---
 src/main/clojure/clojure/core/memoize.clj       |    2 +-
 src/test/clojure/clojure/core/memoize/tests.clj |   31 ++++++++++++++++++++++-
 2 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/src/main/clojure/clojure/core/memoize.clj b/src/main/clojure/clojure/core/memoize.clj
index 80fae51..352e0db 100644
--- a/src/main/clojure/clojure/core/memoize.clj
+++ b/src/main/clojure/clojure/core/memoize.clj
@@ -69,7 +69,7 @@
   [memoized-fn]
   (when-let [cache (:unk (meta memoized-fn))]
     (into {}
-          (for [[k v] (.cache (.cache @cache))]
+          (for [[k v] (.cache @cache)]
             [(vec k) @v]))))
 
 (defn memoized?
diff --git a/src/test/clojure/clojure/core/memoize/tests.clj b/src/test/clojure/clojure/core/memoize/tests.clj
index efe72b0..88cb001 100644
--- a/src/test/clojure/clojure/core/memoize/tests.clj
+++ b/src/test/clojure/clojure/core/memoize/tests.clj
@@ -10,7 +10,10 @@
       :author "Michael Fogus"}
   clojure.core.memoize.tests
   (:use [clojure.core.memoize] :reload-all)
-  (:use [clojure.test]))
+  (:use [clojure.test]
+        [clojure.core.cache :only [defcache lookup has? hit miss seed ttl-cache-factory]])
+  (:import (clojure.core.memoize PluggableMemoization)
+           (clojure.core.cache CacheProtocol)))
 
 (def id (memo identity))
 
@@ -126,3 +129,29 @@
       (is (memo-swap! id {[42] 24}))
       (is 24 (id 42))
       (is 42 ((memo-unwrap id) 42)))))
+
+(defcache PassThrough [impl]
+  CacheProtocol
+  (lookup [_ item]
+          (if (has? impl item)
+            (lookup impl item)
+            (delay nil)))
+  (has? [_ item]
+        (has? impl item))
+  (hit [this item]
+       (PassThrough. (hit impl item)))
+  (miss [this item result]
+        (PassThrough. (miss impl item result)))
+  (seed [_ base]
+        (PassThrough. (seed impl base))))
+
+(defn memo-pass-through [f limit]
+  (build-memoizer
+       #(PluggableMemoization. %1 (PassThrough. (ttl-cache-factory %2 %3)))
+       f
+       limit
+       {}))
+
+(deftest test-snapshot-without-cache-field
+  (testing "that we can call snapshot against an object without a 'cache' field"
+    (snapshot (memo-pass-through identity 2000))))
-- 
1.7.1

