changeset 3145:e4ea47c21480

Add cachefunc to abstract function call cache
author Brendan Cully <brendan@kublai.com>
date Fri, 22 Sep 2006 08:19:25 -0700
parents 8342ad5abe0b
children e69a0cbe268e
files mercurial/util.py
diffstat 1 files changed, 16 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/util.py
+++ b/mercurial/util.py
@@ -24,6 +24,22 @@ defaultdateformats = ('%Y-%m-%d %H:%M:%S
 class SignalInterrupt(Exception):
     """Exception raised on SIGTERM and SIGHUP."""
 
+def cachefunc(func):
+    '''cache the result of function calls'''
+    cache = {}
+    if func.func_code.co_argcount == 1:
+        def f(arg):
+            if arg not in cache:
+                cache[arg] = func(arg)
+            return cache[arg]
+    else:
+        def f(*args):
+            if args not in cache:
+                cache[args] = func(*args)
+            return cache[args]
+
+    return f
+
 def pipefilter(s, cmd):
     '''filter string S through command CMD, returning its output'''
     (pout, pin) = popen2.popen2(cmd, -1, 'b')