
Duncan Coutts wrote:
If everyone thinks this is the right behaviour we can certainly change Data.ByteString to follow. It is supposed to follow the Data.List api.
Good, lines can be best shortly expressed in terms of split as follows: mylines s = if null (last l) then init l else l where l = split '\n' s This is safe (though inefficient), because split always returns a non-empty list (in contrast to Data.ByteString.Char8.split)! Furthermore Data.PackedString.splitPS corresponds to lines. Below are some test case. Cheers Christian import qualified Data.ByteString.Char8 as B import qualified Data.PackedString as P *GHCI> l ["","a","\n","aa","a\n","\na","\n\n"] *GHCI> map (intercalate "\n" . split '\n') l ["","a","\n","aa","a\n","\na","\n\n"] *GHCI> map (B.intercalate (B.pack "\n") . B.split '\n' . B.pack) l ["","a","\n","aa","a\n","\na","\n\n"] *GHCI> map (unlines . lines) l ["","a\n","\n","aa\n","a\n","\na\n","\n\n"] *GHCI> map lines l [[],["a"],[""],["aa"],["a"],["","a"],["",""]] *GHCI> map (lines . unlines . lines) l [[],["a"],[""],["aa"],["a"],["","a"],["",""]] *GHCI> map mylines l [[],["a"],[""],["aa"],["a"],["","a"],["",""]] *GHCI> map (P.splitPS '\n' . P.packString) l [[],["a"],[""],["aa"],["a"],["","a"],["",""]] *GHCI> map (B.split '\n' . B.pack) l [[],["a"],["",""],["aa"],["a",""],["","a"],["","",""]] *GHCI> map (split '\n') l [[""],["a"],["",""],["aa"],["a",""],["","a"],["","",""]]