import Cache from './cache'

export default function memoize(hash = x => x) {
	const f = this
	const cache = new Cache()
	const g = function (...args) {
		const thisAndArgs = [this].concat(args)
		console.time('hash')
		const k = hash(thisAndArgs)
		console.timeEnd('hash')
		console.time('lookup cache')
		if (cache.has(k)) {
			const result = cache.get(k)
			console.timeEnd('lookup cache')
			return result
		}
		console.time(f.name)
		const result = this::f(...args)
		cache.set(k, result)
		console.timeEnd(f.name)
		return result
	}
	return g
}

@@ -1,8 +1,66 @@
+import Debug from 'debug'%0Aconst debug = Debug('memoize')%0A%0A
 import C
@@ -246,32 +246,32 @@
 t(args)%0A
+%0A
 %09%09
-console.time('
+debug('start 
 hash')%0A%09
@@ -305,46 +305,34 @@
 )%0A%09%09
-console.timeEnd('
+debug('end 
 hash')%0A
+%0A
 %09%09
-console.time
+debug
 ('lo
@@ -404,37 +404,24 @@
 %0A%09%09%09
-console.timeEnd('lookup 
+debug('
 cache
+ hit
 ')%0A%09
@@ -446,27 +446,51 @@
 %7D%0A%09%09
-console.time(f.name
+debug('cache miss')%0A%0A%09%09debug('start invoke'
 )%0A%09%09
@@ -521,16 +521,38 @@
 ..args)%0A
+%09%09debug('end invoke')%0A
 %09%09cache.
@@ -570,33 +570,8 @@
 lt)%0A
-%09%09console.timeEnd(f.name)
 %0A%09%09r

use debug instead of console