linesPS is not analagous to lines

Simon Marlow libraries@haskell.org
Mon, 14 Apr 2003 12:22:21 +0100


[ moving to libraries@haskell.org... ]

> I've just switched my code to use PackedStrings rather than=20
> Strings for
> file contents, and ran into what appears to be a bug in the
> Data.PackedString module in ghc 5.04.3.
>=20
> unlines is the inverse of lines, since lines converts empty lines into
> empty strings.  linesPS, however, ignores empty lines.  :( =20
> It seems like
> it would be a good idea to either fix this (which might not=20
> be a good idea,
> if existing code depends on its current behavior), or add a=20
> note in the
> documentation that it isn't analagous to lines, so that other=20
> people won't
> make the same mistake based on its similar name.

Indeed, that looks like a bug.

linePS is defined as (splitPS '\n'), and it appears that splitPS strips =
out empty substring matches.  wordsPS uses this property, so
that it works analogously to List.words (which doesn't return any empty =
words).

However, the comment in the code says that

  joinPS (packString [x]) (splitPS x ls) =3D ls

which isn't true if splitPS removes empty substrings.  It therefore =
looks like splitPS is wrong to drop empty substrings, and
wordsPS should explicitly filter them out.  I'll make this change unless =
anyone complains.

Also, I just noticed that joinPS is missing from Data.PackedString, for =
no apparent reason.

Cheers,
	Simon