1# Copyright 2013 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5def memoize(fn):
6  '''Decorates |fn| to memoize.
7  '''
8  memory = {}
9  def impl(*args, **optargs):
10    full_args = args + tuple(optargs.iteritems())
11    if full_args not in memory:
12      memory[full_args] = fn(*args, **optargs)
13    return memory[full_args]
14  return impl
15