diff --git a/Data/Array/Parallel/Base/Closure.hs b/Data/Array/Parallel/Base/Closure.hs
new file mode 100644
index 0000000000000000000000000000000000000000..e08bdbb974de6065eb3cc420db89a28c7a9ba65a
--- /dev/null
+++ b/Data/Array/Parallel/Base/Closure.hs
@@ -0,0 +1,15 @@
+module Data.Array.Parallel.Base.Closure (
+  (:->)(..), closure, ($:)
+) where
+
+infixr 0 :->
+infixr 0 $:
+
+data a :-> b = forall e. Clo !(e -> a -> b) e
+
+closure :: (e -> a -> b) -> e -> (a :-> b)
+closure = Clo
+
+($:) :: (a :-> b) -> a -> b
+Clo f e $: x = f e x
+
diff --git a/ndp.cabal b/ndp.cabal
index 71f498cb646d78f846cde1bf6f2bbb7bf95e7ef0..9f0fb647fc6c9eeab52a0789485775a9e1e0a0d7 100644
--- a/ndp.cabal
+++ b/ndp.cabal
@@ -12,6 +12,7 @@ exposed-modules:
 	Data.Array.Parallel.Unlifted
         Data.Array.Parallel.Unlifted.Distributed
         Data.Array.Parallel.Unlifted.Parallel
+        Data.Array.Parallel.Base.Closure
 other-modules:
 	Data.Array.Parallel.Base.Config
 	Data.Array.Parallel.Base.Debug
diff --git a/package.conf.in b/package.conf.in
index a2aafd4ee10835eea7d6a559aca0cd76d0bd2594..6e4f27c8785af1fb8d4be38a74c76548e44714d6 100644
--- a/package.conf.in
+++ b/package.conf.in
@@ -5,10 +5,11 @@ maintainer:	ndp@cse.unsw.edu.au
 exposed:	True
 
 exposed-modules:
-	Data.Array.Parallel,
-	Data.Array.Parallel.Unlifted,
+	Data.Array.Parallel
+	Data.Array.Parallel.Unlifted
         Data.Array.Parallel.Unlifted.Distributed
         Data.Array.Parallel.Unlifted.Parallel
+        Data.Array.Parallel.Base.Closure
 
 hidden-modules:
 	Data.Array.Parallel.Base.Config