[PATCH] revset: added generatorset class with cached __contains__ method
Pierre-Yves David
pierre-yves.david at ens-lyon.org
Tue Feb 18 16:32:58 CST 2014
On 02/18/2014 02:29 PM, Lucas Moscovicz wrote:
> # HG changeset patch
> # User Lucas Moscovicz <lmoscovicz at fb.com>
> # Date 1391642591 28800
> # Wed Feb 05 15:23:11 2014 -0800
> # Node ID 7dfddd4a822ee7e5a3ce6f39a0bdf9c533cd76ff
> # Parent c29948fed40a2d9755ecaa01ec05bfa542f65670
> revset: added generatorset class with cached __contains__ method
>
> diff --git a/mercurial/revset.py b/mercurial/revset.py
> --- a/mercurial/revset.py
> +++ b/mercurial/revset.py
> @@ -2131,6 +2131,37 @@
> def set(self):
> return set([r for r in self])
>
> +class generatorset(object):
> + """Wrapper structure for generators that provides lazy membership."""
Could use more doc about all its behavior.
> + def __init__(self, gen):
> + self._gen = gen
> + self._iter = iter(gen)
> + self._cache = {}
> +
> + def __contains__(self, x):
> + if x in self._cache:
> + return self._cache[x]
> +
> + while True:
> + try:
> + l = self._iter.next()
> + self._cache[l] = True
> + if l == x:
> + return True
> + except (StopIteration):
> + break
> +
> + self._cache[x] = False
> + return False
> +
> + def __iter__(self):
> + for item in self._gen:
> + self._cache[item] = True
> + yield item
> +
> + def set(self):
> + return self
Sounds wrong to me, is there precendence of a set() method returning a
non set object?
More information about the Mercurial-devel
mailing list