Source code for redex.combinator._select

"""The select combinator."""

from typing import Optional, List
from redex.function import Signature
from redex.stack import stackmethod, Stack
from redex.combinator._base import Combinator

# pylint: disable=too-few-public-methods
[docs]class Select(Combinator): """The select combinator.""" indices: List[int] """a sequence of 0-based indices relative to the top of the stack.""" @stackmethod def __call__(self, stack: Stack) -> Stack: selected = tuple(stack[i] for i in self.indices) return selected + stack[self.signature.n_in :]
[docs]def select(indices: List[int], n_in: Optional[int] = None) -> Select: """Creates a select combinator. The combinator allows to change order or copy inputs. >>> from redex import combinator as cb >>> select = cb.select([0, 0, 1, 1]) >>> select(1, 2, 3, 4) == (1, 1, 2, 2, 3, 4) True Args: indices: a sequence of 0-based indices relative to the top of the stack. n_in: a number of items to pop from the stack, and replace with those specified by `indices`. If not specified, the value will be calculated as `max(indices) + 1`. Returns: a combinator. """ n_out = len(indices) if n_in is None: n_in = max(indices) + 1 if len(indices) != 0 else 0 return Select(signature=Signature(n_in=n_in, n_out=n_out), indices=indices)