breakM predM l@(x:xs) = do
    val <- predM x
    case val of
        True -> return ([], l)
        _ -> do
                (ys, zs) <- breakM predM xs
                return (x:ys, zs)
breakM predM l@(x:xs) = do
    val <- predM x
    case val of
        True -> return ([], l)
        _ -> do
                (ys, zs) <- breakM predM xs
                return (x:ys, zs)
breakM predM l@(x:xs) = do
    val <- predM x
    case val of
        True -> return ([], l)
        _ -> do
                (ys, zs) <- breakM predM xs
                return (x:ys, zs)