Home | History | Annotate | Download | only in test_utils
      1 #
      2 # Copyright (c) 2005 Dima Dorfman.
      3 # All rights reserved.
      4 #
      5 # Redistribution and use in source and binary forms, with or without
      6 # modification, are permitted provided that the following conditions
      7 # are met:
      8 # 1. Redistributions of source code must retain the above copyright
      9 #    notice, this list of conditions and the following disclaimer.
     10 # 2. Redistributions in binary form must reproduce the above copyright
     11 #    notice, this list of conditions and the following disclaimer in the
     12 #    documentation and/or other materials provided with the distribution.
     13 #
     14 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     15 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     16 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     17 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     18 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     19 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     20 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     21 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     22 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     23 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     24 # SUCH DAMAGE.
     25 #
     26 
     27 __all__ = ['compose', 'fastcut']
     28 __revision__ = '$Dima: pylib/functools/functools.py,v 1.2 2005/08/22 07:05:22 dima Exp $'
     29 
     30 
     31 def compose(*args):
     32 
     33     if len(args) < 1:
     34         raise TypeError, 'compose expects at least one argument'
     35     fs = args[-2::-1]
     36     g = args[-1]
     37 
     38     def composecall(*args, **kw):
     39         res = g(*args, **kw)
     40         for f in fs:
     41             res = f(res)
     42         return res
     43 
     44     return composecall
     45 
     46 
     47 def fastcut(*sargs, **skw):
     48     try:
     49         fun = sargs[0]
     50     except IndexError:
     51         raise TypeError, 'fastcut requires at least one argument'
     52     sargs = sargs[1:]
     53 
     54     def fastcutcall(*args, **kw):
     55         rkw = skw.copy()
     56         rkw.update(kw)
     57         return fun(*(sargs + args), **rkw)
     58 
     59     return fastcutcall
     60 
     61 
     62 for x in __all__:
     63     globals()['py_%s' % x] = globals()[x]
     64 del x
     65 
     66 try:
     67     import _functools
     68 except ImportError:
     69     pass
     70 else:
     71     for x in __all__:
     72         globals()['c_%s' % x] = globals()[x] = getattr(_functools, x)
     73     del x
     74