summaryrefslogtreecommitdiff
path: root/Codec/LineReady.hs
diff options
context:
space:
mode:
authorJames Crayne <jim.crayne@gmail.com>2015-06-22 18:58:47 -0400
committerJames Crayne <jim.crayne@gmail.com>2015-06-22 18:59:39 -0400
commit2966db997f43c063389285ddc40579acad5c6a29 (patch)
tree76a2aaa39aae69d892162fc16754c5993329ce70 /Codec/LineReady.hs
parentaed7356d85229ae0ee19d55edb682e6212b5a8a0 (diff)
kikid: Serialization...
Diffstat (limited to 'Codec/LineReady.hs')
-rw-r--r--Codec/LineReady.hs23
1 files changed, 23 insertions, 0 deletions
diff --git a/Codec/LineReady.hs b/Codec/LineReady.hs
new file mode 100644
index 0000000..ca2cde3
--- /dev/null
+++ b/Codec/LineReady.hs
@@ -0,0 +1,23 @@
1module Codec.LineReady where
2
3import qualified Data.ByteString.Char8 as B
4import Data.Monoid
5import Data.List (foldl')
6import Data.Maybe
7
8toLineReady :: B.ByteString -> B.ByteString
9toLineReady blob =
10 let as = zip [0..] (B.unpack blob)
11 bs = filter ((=='\n') . snd) as
12 is = map fst bs
13 in B.pack (show is) <> foldl' (replaceCharStrIndex '#') blob is <> B.singleton '\n'
14
15replaceCharStrIndex :: Char -> B.ByteString -> Int -> B.ByteString
16replaceCharStrIndex c str i = a <> B.singleton c <> B.drop 1 b
17 where (a,b) = B.splitAt i str
18
19fromLineReady :: B.ByteString -> B.ByteString
20fromLineReady str = foldl' (replaceCharStrIndex '\n') (B.drop 1 str') is
21 where is = map fst . mapMaybe B.readInt $
22 B.groupBy (\c d -> (c/=',')&&(d/=',')) ls
23 (ls,str') = B.break (==']') (B.tail str)