spanPS, -- :: (Char -> Bool) -> PackedString -> (PackedString, PackedString)
breakPS, -- :: (Char -> Bool) -> PackedString -> (PackedString, PackedString)
linesPS, -- :: PackedString -> [PackedString]
-
+ unlinesPS, -- :: [PackedString] -> PackedString
wordsPS, -- :: PackedString -> [PackedString]
+ unwordsPS, -- :: [PackedString] -> PackedString
splitPS, -- :: Char -> PackedString -> [PackedString]
splitWithPS, -- :: (Char -> Bool) -> PackedString -> [PackedString]
--- joinPS, -- :: PackedString -> [PackedString] -> PackedString
+ joinPS, -- :: PackedString -> [PackedString] -> PackedString
) where
linesPS :: PackedString -> [PackedString]
linesPS ps = splitPS '\n' ps
+unlinesPS :: [PackedString] -> PackedString
+unlinesPS = joinPS (packString "\n")
+
wordsPS :: PackedString -> [PackedString]
-wordsPS ps = splitWithPS isSpace ps
+wordsPS ps = filter (not.nullPS) (splitWithPS isSpace ps)
+
+unwordsPS :: [PackedString] -> PackedString
+unwordsPS = joinPS (packString " ")
reversePS :: PackedString -> PackedString
reversePS ps = packString (reverse (unpackPS ps))
concatPS pss = packString (concat (map unpackPS pss))
------------------------------------------------------------
-{-
+
joinPS :: PackedString -> [PackedString] -> PackedString
joinPS filler pss = concatPS (splice pss)
where
* splitPS x ls = ls'
where False = any (map (x `elemPS`) ls')
- False = any (map (nullPS) ls')
-
- * all x's have been chopped out.
- * no empty PackedStrings in returned list. A conseq.
- of this is:
- splitPS x nilPS = []
-
- * joinPS (packString [x]) (_splitPS x ls) = ls
-
--}
+ * joinPS (packString [x]) (splitPS x ls) = ls
-}
splitPS :: Char -> PackedString -> [PackedString]
let
break_pt = first_pos_that_satisfies pred ps len n
in
- if break_pt == n then -- immediate match, no substring to cut out.
- splitify (break_pt + 1)
+ if break_pt == n then -- immediate match, empty substring
+ nilPS
+ : splitify (break_pt + 1)
else
substrPS (PS ps) n (break_pt - 1) -- leave out the matching character
: splitify (break_pt + 1)