diff --git a/non-empty.cabal b/non-empty.cabal
--- a/non-empty.cabal
+++ b/non-empty.cabal
@@ -1,6 +1,6 @@
 Cabal-Version:    2.2
 Name:             non-empty
-Version:          0.3.4
+Version:          0.3.5
 License:          BSD-3-Clause
 License-File:     LICENSE
 Author:           Henning Thielemann <haskell@henning-thielemann.de>
@@ -68,7 +68,7 @@
   Makefile
 
 Source-Repository this
-  Tag:         0.3.4
+  Tag:         0.3.5
   Type:        darcs
   Location:    https://hub.darcs.net/thielema/non-empty/
 
diff --git a/src/Data/NonEmpty.hs b/src/Data/NonEmpty.hs
--- a/src/Data/NonEmpty.hs
+++ b/src/Data/NonEmpty.hs
@@ -33,6 +33,7 @@
    scanl, scanr,
    tails, inits, initsRev,
    removeEach,
+   takeUntil,
    partitionEithersLeft,
    partitionEithersRight,
    ) where
diff --git a/src/Data/NonEmptyPrivate.hs b/src/Data/NonEmptyPrivate.hs
--- a/src/Data/NonEmptyPrivate.hs
+++ b/src/Data/NonEmptyPrivate.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE FlexibleContexts #-}
 module Data.NonEmptyPrivate where
 
 import qualified Data.NonEmpty.Foldable as FoldU
@@ -46,6 +47,7 @@
 >>> import Data.Tuple.HT (swap)
 >>> import Data.Maybe (mapMaybe)
 >>> import Control.Applicative (liftA2)
+>>> import Control.Functor.HT (void)
 >>> import qualified Test.QuickCheck as QC
 >>>
 >>> forRange :: (QC.Testable test) => ((Char,Char) -> test) -> QC.Property
@@ -598,6 +600,9 @@
 removeEach :: (Traversable f) => T f a -> T f (a, f a)
 removeEach xs  =  mapWithIndex (\n _ -> removeAt n xs) 0 xs
 
+{- |
+prop> let takeUntil p xs = NonEmpty.zipWith const xs $ () !: void (takeWhile (not . p) $ NonEmpty.flatten xs) in \k xs -> takeUntil (>=k) xs == NonEmpty.takeUntil (>=(k::Int)) xs
+-}
 takeUntil :: (a -> Bool) -> T [] a -> T [] a
 takeUntil p (Cons x xs) =
    x !: if p x then [] else ListHT.takeUntil p xs
@@ -782,6 +787,9 @@
       in \superOffset (Cons i is) ->
             C.indexHorner (ls,us) (superOffset*size + Ix.index (l,u) i) is
 
+{-
+GHC-7.10 requires FlexibleContexts extension for this instance.
+-}
 instance (C.Ix f, Ix.Ix i, Ord (f i)) => Ix.Ix (T f i) where
    range = C.range
    index = C.index
diff --git a/test/Test/Data/NonEmptyPrivate.hs b/test/Test/Data/NonEmptyPrivate.hs
--- a/test/Test/Data/NonEmptyPrivate.hs
+++ b/test/Test/Data/NonEmptyPrivate.hs
@@ -1,11 +1,11 @@
 -- Do not edit! Automatically created with doctest-extract from src/Data/NonEmptyPrivate.hs
-{-# LINE 39 "src/Data/NonEmptyPrivate.hs" #-}
+{-# LINE 40 "src/Data/NonEmptyPrivate.hs" #-}
 
 module Test.Data.NonEmptyPrivate where
 
 import qualified Test.DocTest.Driver as DocTest
 
-{-# LINE 40 "src/Data/NonEmptyPrivate.hs" #-}
+{-# LINE 41 "src/Data/NonEmptyPrivate.hs" #-}
 import     qualified Data.NonEmpty as NonEmpty
 import     qualified Data.Empty as Empty
 import     qualified Data.Either.HT as EitherHT
@@ -15,6 +15,7 @@
 import     Data.Tuple.HT (swap)
 import     Data.Maybe (mapMaybe)
 import     Control.Applicative (liftA2)
+import     Control.Functor.HT (void)
 import     qualified Test.QuickCheck as QC
 
 forRange     :: (QC.Testable test) => ((Char,Char) -> test) -> QC.Property
@@ -23,28 +24,33 @@
 
 test :: DocTest.T ()
 test = do
- DocTest.printPrefix "Data.NonEmptyPrivate:743: "
-{-# LINE 743 "src/Data/NonEmptyPrivate.hs" #-}
+ DocTest.printPrefix "Data.NonEmptyPrivate:604: "
+{-# LINE 604 "src/Data/NonEmptyPrivate.hs" #-}
  DocTest.property
-{-# LINE 743 "src/Data/NonEmptyPrivate.hs" #-}
+{-# LINE 604 "src/Data/NonEmptyPrivate.hs" #-}
+     (let takeUntil p xs = NonEmpty.zipWith const xs $ () !: void (takeWhile (not . p) $ NonEmpty.flatten xs) in \k xs -> takeUntil (>=k) xs == NonEmpty.takeUntil (>=(k::Int)) xs)
+ DocTest.printPrefix "Data.NonEmptyPrivate:748: "
+{-# LINE 748 "src/Data/NonEmptyPrivate.hs" #-}
+ DocTest.property
+{-# LINE 748 "src/Data/NonEmptyPrivate.hs" #-}
      (\xs -> mapMaybe EitherHT.maybeLeft (NonEmpty.flatten xs) == either NonEmpty.flatten fst (NonEmpty.partitionEithersLeft (xs::NonEmpty.T[](Either Char Int))))
- DocTest.printPrefix "Data.NonEmptyPrivate:744: "
-{-# LINE 744 "src/Data/NonEmptyPrivate.hs" #-}
+ DocTest.printPrefix "Data.NonEmptyPrivate:749: "
+{-# LINE 749 "src/Data/NonEmptyPrivate.hs" #-}
  DocTest.property
-{-# LINE 744 "src/Data/NonEmptyPrivate.hs" #-}
+{-# LINE 749 "src/Data/NonEmptyPrivate.hs" #-}
      (\xs -> mapMaybe EitherHT.maybeRight (NonEmpty.flatten xs) == either (const []) (NonEmpty.flatten . snd) (NonEmpty.partitionEithersLeft (xs::NonEmpty.T[](Either Char Int))))
- DocTest.printPrefix "Data.NonEmptyPrivate:745: "
-{-# LINE 745 "src/Data/NonEmptyPrivate.hs" #-}
+ DocTest.printPrefix "Data.NonEmptyPrivate:750: "
+{-# LINE 750 "src/Data/NonEmptyPrivate.hs" #-}
  DocTest.property
-{-# LINE 745 "src/Data/NonEmptyPrivate.hs" #-}
+{-# LINE 750 "src/Data/NonEmptyPrivate.hs" #-}
      (\xs -> NonEmpty.partitionEithersRight (fmap EitherHT.swap xs) == EitherHT.mapLeft swap (EitherHT.swap (NonEmpty.partitionEithersLeft (xs::NonEmpty.T[](Either Char Int)))))
- DocTest.printPrefix "Data.NonEmptyPrivate:755: "
-{-# LINE 755 "src/Data/NonEmptyPrivate.hs" #-}
+ DocTest.printPrefix "Data.NonEmptyPrivate:760: "
+{-# LINE 760 "src/Data/NonEmptyPrivate.hs" #-}
  DocTest.property
-{-# LINE 755 "src/Data/NonEmptyPrivate.hs" #-}
+{-# LINE 760 "src/Data/NonEmptyPrivate.hs" #-}
      (\xs -> NonEmpty.partitionEithersLeft (fmap EitherHT.swap xs) == EitherHT.mapRight swap (EitherHT.swap (NonEmpty.partitionEithersRight (xs::NonEmpty.T[](Either Char Int)))))
- DocTest.printPrefix "Data.NonEmptyPrivate:766: "
-{-# LINE 766 "src/Data/NonEmptyPrivate.hs" #-}
+ DocTest.printPrefix "Data.NonEmptyPrivate:771: "
+{-# LINE 771 "src/Data/NonEmptyPrivate.hs" #-}
  DocTest.property
-{-# LINE 766 "src/Data/NonEmptyPrivate.hs" #-}
+{-# LINE 771 "src/Data/NonEmptyPrivate.hs" #-}
      (forRange $ \b0 -> forRange $ \b1 -> forRange $ \b2 -> let b = FuncHT.unzip $ b0!:b1!:b2!:Empty.Cons in map (Ix.index b) (Ix.range b) == take (Ix.rangeSize b) [0..])
