aboutsummaryrefslogtreecommitdiffstats
path: root/src/test.py
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-03-07 03:24:33 +0100
committerMattias Andrée <maandree@operamail.com>2014-03-07 03:24:33 +0100
commitc5fc4472d78b20a0afda0cf65b61b0dad9130f81 (patch)
tree5a8ca54b6509d7f5984e3bd0aa20fa0a1d96959a /src/test.py
parentadd readme (diff)
downloadjoin-python-c5fc4472d78b20a0afda0cf65b61b0dad9130f81.tar.gz
join-python-c5fc4472d78b20a0afda0cf65b61b0dad9130f81.tar.bz2
join-python-c5fc4472d78b20a0afda0cf65b61b0dad9130f81.tar.xz
add test
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to 'src/test.py')
-rwxr-xr-xsrc/test.py72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/test.py b/src/test.py
new file mode 100755
index 0000000..125d979
--- /dev/null
+++ b/src/test.py
@@ -0,0 +1,72 @@
+#!/usr/bin/python3
+# -*- python -*-
+'''
+join python – Join-calculus for Python
+Copyright © 2014 Mattias Andrée (maandree@member.fsf.org)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+'''
+
+import time
+import threading
+
+
+class signal:
+ def __init__(self, f):
+ self.f = f
+
+ def __call__(self, *args, **kwargs):
+ threading.Thread(target = self.f, args = args, kwargs = kwargs).start()
+
+
+class joinable:
+ def __init__(self, f):
+ self.f = f
+ self.queue = []
+ self.condition = threading.Condition()
+
+ def __call__(self, *args, **kwargs):
+ self.f(*args, **kwargs)
+ self.condition.acquire()
+ self.queue.append((args, kwargs))
+ self.condition.notify()
+ self.condition.release()
+
+
+def join(f):
+ f.condition.acquire()
+ f.condition.wait()
+ (jargs, jkwargs) = f.queue.pop(0)
+ f.condition.release()
+ return (jargs, jkwargs)
+
+
+class test:
+ @signal
+ def signal(f, *args):
+ f(*args)
+
+ @joinable
+ def joinable(*args, **kwargs):
+ pass
+
+ def join(param):
+ (jargs, jkwargs) = join(test.joinable)
+ print(param, dict(jkwargs), *jargs)
+
+
+test.signal(test.join, 'join')
+time.sleep(1)
+test.joinable('arg1', 'arg2', a = 'A', b = 'B')
+