Tips and Tricks
===============

Toolz functions can be combined to make functions that, while common, aren't
a part of toolz's standard offerings. This section presents
a few of these recipes.


* .. function:: pick(allowlist, dictionary)

  Return a subset of the provided dictionary with keys contained in the
  allowlist.

  ::

    from toolz import keyfilter

    def pick(allowlist, d):
        return keyfilter(lambda k: k in allowlist, d)


  Example:

    >>> alphabet = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
    >>> pick(['a', 'b'], alphabet)
    {'a': 1, 'b': 2}


* .. function:: omit(denylist, dictionary)

  Return a subset of the provided dictionary with keys *not* contained in the
  denylist.

  ::

    from toolz import keyfilter

    def omit(denylist, d):
        return keyfilter(lambda k: k not in denylist, d)


  Example:

    >>> alphabet = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
    >>> omit(['a', 'b'], alphabet)
    {'c': 3, 'd': 4}


* .. function:: compact(iterable)

  Filter an iterable on "truthy" values.

  ::

    from toolz import filter

    def compact(iter):
        return filter(None, iter)


  Example:

    >>> results = [0, 1, 2, None, 3, False]
    >>> list(compact(results))
    [1, 2, 3]

* .. function:: keyjoin(leftkey, leftseq, rightkey, rightseq)

  Inner join two sequences of dictionaries on specified keys, merging matches with right value
  precedence.

  ::

    from itertools import starmap
    from toolz import join, merge

    def keyjoin(leftkey, leftseq, rightkey, rightseq):
        return starmap(merge, join(leftkey, leftseq, rightkey, rightseq))


  Example:

   >>> people = [{'id': 0, 'name': 'Anonymous Guy', 'location': 'Unknown'},
                 {'id': 1, 'name': 'Karan', 'location': 'San Francisco'},
                 {'id': 2, 'name': 'Matthew', 'location': 'Oakland'}]
   >>> hobbies = [{'person_id': 1, 'hobby': 'Tennis'},
                  {'person_id': 1, 'hobby': 'Acting'},
                  {'person_id': 2, 'hobby': 'Biking'}]
   >>> list(keyjoin('id', people, 'person_id', hobbies))
   [{'hobby': 'Tennis',
     'id': 1,
     'location': 'San Francisco',
     'name': 'Karan',
     'person_id': 1},
    {'hobby': 'Acting',
     'id': 1,
     'location': 'San Francisco',
     'name': 'Karan',
     'person_id': 1},
    {'hobby': 'Biking',
     'id': 2,
     'location': 'Oakland',
     'name': 'Matthew',
     'person_id': 2}]

* .. function:: areidentical(\*seqs)

  Determine if sequences are identical element-wise.
  This lazily evaluates the sequences and stops as soon as the result
  is determined.

  ::

    from toolz import diff

    def areidentical(*seqs):
        return not any(diff(*seqs, default=object()))


  Example:

   >>> areidentical([1, 2, 3], (1, 2, 3))
   True

   >>> areidentical([1, 2, 3], [1, 2])
   False
