diff --git a/dense-int-set.cabal b/dense-int-set.cabal
--- a/dense-int-set.cabal
+++ b/dense-int-set.cabal
@@ -1,5 +1,5 @@
 name: dense-int-set
-version: 0.1.5
+version: 0.2
 category: Data
 synopsis: Dense int-set
 homepage: https://github.com/metrix-ai/dense-int-set
diff --git a/library/DenseIntSet.hs b/library/DenseIntSet.hs
--- a/library/DenseIntSet.hs
+++ b/library/DenseIntSet.hs
@@ -14,8 +14,8 @@
   lookup,
   -- *** Vectors
   presentElementsVector,
-  filterVector,
   indexVector,
+  filterVector,
   -- *** Unfoldrs
   presentElementsUnfoldr,
   absentElementsUnfoldr,
@@ -171,16 +171,28 @@
 {-|
 Extract the present elements into a vector.
 -}
-presentElementsVector :: GenericVector.Vector vector Int => DenseIntSet -> vector Int
-presentElementsVector intSet = let
+presentElementsVector :: GenericVector.Vector vector element => DenseIntSet -> (Int -> element) -> vector element
+presentElementsVector intSet intToIndex = let
   sizeVal = size intSet
   unfoldr = Unfoldr.zipWithIndex (presentElementsUnfoldr intSet)
   in runST $ do
     mv <- MutableGenericVector.unsafeNew sizeVal
-    forM_ unfoldr $ \ (index, element) -> MutableGenericVector.unsafeWrite mv index element
+    forM_ unfoldr $ \ (index, element) -> MutableGenericVector.unsafeWrite mv index (intToIndex element)
     GenericVector.unsafeFreeze mv
 
 {-|
+Construct a vector, which maps from the original ints into their indices amongst the ones present in the set.
+-}
+indexVector :: GenericVector.Vector vector (Maybe index) => DenseIntSet -> (Int -> index) -> vector (Maybe index)
+indexVector set@(DenseIntSet setVec) intToIndex = let
+  indexVecSize = GenericVector.length setVec * 64
+  in runST $ do
+    v <- MutableGenericVector.replicate indexVecSize Nothing
+    forM_ (Unfoldr.zipWithIndex (presentElementsUnfoldr set)) $ \ (index, element) -> do
+      MutableGenericVector.unsafeWrite v element (Just (intToIndex index))
+    GenericVector.unsafeFreeze v
+
+{-|
 Filter a vector, leaving only the entries, under the indices, which are in the set.
 
 It is your responsibility to ensure that the indices in the set don't exceed the original vector's bounds.
@@ -193,18 +205,6 @@
     forM_ (Unfoldr.zipWithIndex (vectorElementsUnfoldr vector set)) $ \ (newIndex, a) -> do
       MutableGenericVector.unsafeWrite newVector newIndex a
     GenericVector.unsafeFreeze newVector
-
-{-|
-Construct a vector, which maps from the original ints into their indices amongst the ones present in the set.
--}
-indexVector :: GenericVector.Vector vector (Maybe Int) => DenseIntSet -> vector (Maybe Int)
-indexVector set@(DenseIntSet setVec) = let
-  indexVecSize = GenericVector.length setVec * 64
-  in runST $ do
-    v <- MutableGenericVector.replicate indexVecSize Nothing
-    forM_ (Unfoldr.zipWithIndex (presentElementsUnfoldr set)) $ \ (index, element) -> do
-      MutableGenericVector.unsafeWrite v element (Just index)
-    GenericVector.unsafeFreeze v
 
 
 -- ** Unfoldr
