diff --git a/Util.hs b/Util.hs
--- a/Util.hs
+++ b/Util.hs
@@ -71,10 +71,13 @@
 (∘∘) :: (c -> d) -> (a -> b -> c) -> (a -> b -> d)
 (f ∘∘ g) x y = f (g x y)
 
-infixl 0 `onn`
+infixl 0 `onn`, `onnn`
 onn :: (a -> a -> a -> b) -> (c -> a) -> c -> c -> c -> b
 onn f g x y z = f (g x) (g y) (g z)
 
+onnn :: (a -> a -> a -> a -> b) -> (c -> a) -> c -> c -> c -> c -> b
+onnn f g w x y z = f (g w) (g x) (g y) (g z)
+
 fst3 :: (a, b, c) -> a
 fst3 (x,_,_) = x
 
@@ -136,8 +139,14 @@
 uncurry3 :: (a -> b -> c -> d) -> (a, b, c) -> d
 uncurry3 f (x, y, z) = f x y z
 
+uncurry4 :: (a -> b -> c -> d -> e) -> (a, b, c, d) -> e
+uncurry4 f (w, x, y, z) = f w x y z
+
 curry3 :: ((a, b, c) -> d) -> a -> b -> c -> d
 curry3 f x y z = f (x, y, z)
+
+curry4 :: ((a, b, c, d) -> e) -> a -> b -> c -> d -> e
+curry4 f w x y z = f (w, x, y, z)
 
 infix 4 ∈, ∉
 (∈), (∉) :: (Eq a, Foldable f) => a -> f a -> Bool
diff --git a/Util/List.hs b/Util/List.hs
new file mode 100644
--- /dev/null
+++ b/Util/List.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE ViewPatterns #-}
+
+module Util.List where
+
+import Data.Bool
+import Data.List.NonEmpty (NonEmpty (..))
+
+splitWhen :: (a -> Bool) -> [a] -> NonEmpty [a]
+splitWhen p = go
+  where
+    go = \ case
+        [] -> []:|[]
+        a:(go -> as:|ass) | p a -> []:|as:ass | True -> (a:as):|ass
diff --git a/Util/Monad/ST/Unsafe.hs b/Util/Monad/ST/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/Util/Monad/ST/Unsafe.hs
@@ -0,0 +1,16 @@
+module Util.Monad.ST.Unsafe where
+
+import Prelude (seq)
+import Control.Applicative
+import Control.Category (Category (..))
+import Control.Monad (Monad (..))
+import Control.Monad.ST
+import Control.Monad.ST.Unsafe
+import Data.Maybe (Maybe (..))
+
+unsafeInterleaveWhileJust :: ST s (Maybe a) -> (a -> ST s ()) -> ST s [a]
+unsafeInterleaveWhileJust mma f = go
+  where
+    go = mma >>= unsafeInterleaveST . \ case
+        Nothing -> pure []
+        Just a -> (a :) <$> unsafeInterleaveST (a `seq` f a *> go)
diff --git a/util.cabal b/util.cabal
--- a/util.cabal
+++ b/util.cabal
@@ -1,5 +1,5 @@
 name:                util
-version:             0.1.10.1
+version:             0.1.11.0
 synopsis:            Utilities
 -- description:         
 license:             BSD3
@@ -14,12 +14,15 @@
 library
   exposed-modules:     Util
                      , Util.Bits
+                     , Util.List
+                     , Util.Monad.ST.Unsafe
   -- other-modules:       
   -- other-extensions:    
   build-depends:       base >=4.9 && <5
   -- hs-source-dirs:      
   default-language:    Haskell2010
   default-extensions:  NoImplicitPrelude
+                     , LambdaCase
                      , GeneralizedNewtypeDeriving
                      , DeriveFunctor
                      , DeriveFoldable
