aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/package.lisp9
-rw-r--r--src/wait-group.lisp27
-rw-r--r--wait-group.asd6
3 files changed, 42 insertions, 0 deletions
diff --git a/src/package.lisp b/src/package.lisp
new file mode 100644
index 0000000..c868d02
--- /dev/null
+++ b/src/package.lisp
@@ -0,0 +1,9 @@
+(defpackage :wait-group
+ (:nicknames :wg)
+
+ (:use :cl)
+
+ (:export #:make-wait-group
+ #:add
+ #:done
+ #:wait))
diff --git a/src/wait-group.lisp b/src/wait-group.lisp
new file mode 100644
index 0000000..35bb982
--- /dev/null
+++ b/src/wait-group.lisp
@@ -0,0 +1,27 @@
+(in-package :wait-group)
+
+(defclass wait-group ()
+ ((counter
+ :initform 0
+ :accessor counter)))
+
+(defun make-wait-group ()
+ (make-instance 'wait-group))
+
+(defgeneric add (wait-group &optional amount)
+ (:documentation ""))
+
+(defmethod add ((wait-group wait-group) &optional (amount 1))
+ (incf (counter wait-group) amount))
+
+(defgeneric done (wait-group)
+ (:documentation ""))
+
+(defmethod done ((wait-group wait-group))
+ (decf (counter wait-group)))
+
+(defgeneric wait (wait-group)
+ (:documentation ""))
+
+(defmethod wait ((wait-group wait-group))
+ (loop until (= (counter wait-group) 0)))
diff --git a/wait-group.asd b/wait-group.asd
new file mode 100644
index 0000000..ac7e280
--- /dev/null
+++ b/wait-group.asd
@@ -0,0 +1,6 @@
+(asdf:defsystem wait-group
+ :version "0.0.1"
+ :components ((:module "src"
+ :serial t
+ :components ((:file "package")
+ (:file "wait-group")))))