    module Data.List.Extended
        ( module Data.List
        , breakWhen
        ) where

    import           Data.List

    -- | Like 'break', but can act on the entire tail of the list.
    breakWhen :: ([a] -> Bool) -> [a] -> ([a], [a])
    breakWhen predicate = go []
      where
        go buf []                = (reverse buf, [])
        go buf (x : xs)
            | predicate (x : xs) = (reverse buf, x : xs)
            | otherwise          = go (x : buf) xs