Maxim Moiseev avatar Maxim Moiseev committed 7064b91

code rearrangements and initial unittests

Comments (0)

Files changed (5)

Empty file added.

+import functools as f
+
+def ignore(*args, **kwargs):
+    '''Ignores all the arguments being passed in.
+    Might be usefule when you need a fucntion, but do not care of it's result'''
+    pass
+
+def const(x):
+    '''Creates a function that returns x regardless of arguments'''
+    def _const(*args, **kwargs):
+        return x
+    return _const
+
+def id_(x):
+    '''Identity function'''
+    return x
+
+def flip(f):
+    '''Creates a function taking a reversed list of arguments.
+    Keyword arguments remain unchanged.'''
+    def _fliped(*args, **kwargs):
+        return f(*reversed(args), **kwargs)
+    return _flipped
+
+def _compose2(f, g):
+    def _compose_innner(*args, **kwargs):
+        return f(g(*args, **kwargs))
+    return _compose_inner
+
+def compose(*fs):
+    '''Composition of several functions'''
+    if len(fs) == 1:
+        # a list of functions has been passed in
+        fs = fs[0]
+    return reduce(_compose2, fs)
+
+def _Foonc(object):
+    '''Somewhat useful function wrapper'''
+    def __init__(self, f):
+        self._f = f
+
+    def __call__(*args, **kwargs):
+        return self._f(*args, **kwargs)
+
+    @staticmethod
+    def _unwrap(f):
+        if isinstance(f, _Foonc):
+            return f._f
+        return f
+
+    def __rshift__(self, other):
+        f = self._unwrap(other)
+        return _Foonc(compose(f, self._f))
+
+    def __lshift__(self, other):
+        f = self._unwrap(other)
+        return _Foonc(compose(self._f, f))
+

foonctest/__init__.py

+import sys
+import unittest
+
+import foonc
+
+def suite():
+    suite = unittest.TestSuite()
+    suite.addTests(foonc.suite())
+    return suite
+
+if __name__ == '__main__':
+    runner = unittest.TextTestRunner()
+    result = runner.run(suite())
+    sys.exit(not result.wasSuccessful())

foonctest/foonc.py

+import unittest
+
+from foonc import foonc
+
+
+def inc(x):
+    return x + 1
+
+class FooncTests(unittest.TestCase):
+    def setUp(self):
+        super(FooncTests, self).setUp()
+
+    def test_const(self):
+        self.assertEqual(42, foonc.const(42)('whatever', is_passed='in'))
+
+    def test_compose2(self):
+        f = foonc._compose2(int, inc)
+        self.assertEqual(42, f('41'))
+
+
+class FooncWraperTests(unittest.TestCase):
+    pass
+
+
+def suite():
+    suite = unittest.TestSuite()
+    suite.addTests(unittest.makeSuite(FooncTests))
+    suite.addTests(unittest.makeSuite(FooncWrapperTests))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main()

src/foonc.py

-import functools as f
-
-def ignore(*args, **kwargs):
-    '''Ignores all the arguments being passed in.
-    Might be usefule when you need a fucntion, but do not care of it's result'''
-    pass
-
-def const(x):
-    '''Creates a function that returns x regardless of arguments'''
-    def _const(*args, **kwargs):
-        return x
-    return _const
-
-def id_(x):
-    '''Identity function'''
-    return x
-
-def _compose2(f, g):
-    def _compose_innner(*args, **kwargs):
-        return f(g(*args, **kwargs))
-    return _compose_inner
-
-def compose(*fs):
-    '''Composition of several functions'''
-    if len(fs) == 1:
-        # a list of functions has been passed in
-        fs = fs[0]
-    return reduce(_compose2, fs)
-
-def _Foonc(object):
-    '''Somewhat useful function wrapper'''
-    def __init__(self, f):
-        self._f = f
-
-    def __call__(*args, **kwargs):
-        return self._f(*args, **kwargs)
-
-    @staticmethod
-    def _unwrap(f):
-        if isinstance(f, _Foonc):
-            return f._f
-        return f
-
-    def __rshift__(self, other):
-        f = self._unwrap(other)
-        return _Foonc(compose(f, self._f))
-
-    def __lshift__(self, other):
-        f = self._unwrap(other)
-        return _Foonc(compose(self._f, f))
-
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.