module Main where
import qualified Data.ByteString.Char8 as BS
import Data
.Maybe (fromMaybe
) import Data
.Char (isSpace
) import Control
.Monad.State
.Lazy
import Control.Applicative
-----BEGIN PARSER-----
type Parser a
= StateT BS
.ByteString
Maybe a
skipSpaces
(x
, s
) = (x
, BS
.dropWhile isSpace s
)
readInt
= StateT
$ fmap skipSpaces
. BS
.readInt
-----END PARSER------
-----BEGIN COMBINATORS-----
readPair = do
x <- readInt
y <- readInt
readIntList
:: Int -> Parser
[Int]readIntList n
= sequence $ replicate n readInt
readSizedList
:: Parser
[Int]readSizedList = readInt >>= readIntList
-----END COMBINATORS-----
-- Testing...
orFail = fromMaybe (BS.pack "EPIC FAIL!!!\n")
parsePrint
:: Show a
=> Parser a
-> (BS
.ByteString
-> BS
.ByteString
)parsePrint parseMe = orFail . evalStateT (do x <- parseMe
testPair = parsePrint (Struct <$> readInt <*> readPair <*> readSizedList)
bW9kdWxlIE1haW4gd2hlcmUKCmltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkNoYXI4IGFzIEJTCmltcG9ydCBEYXRhLk1heWJlIChmcm9tTWF5YmUpCmltcG9ydCBEYXRhLkNoYXIgKGlzU3BhY2UpCmltcG9ydCBDb250cm9sLk1vbmFkLlN0YXRlLkxhenkKaW1wb3J0IENvbnRyb2wuQXBwbGljYXRpdmUKCi0tLS0tQkVHSU4gUEFSU0VSLS0tLS0KCnR5cGUgUGFyc2VyIGEgPSBTdGF0ZVQgQlMuQnl0ZVN0cmluZyBNYXliZSBhCgpza2lwU3BhY2VzICh4LCBzKSA9ICh4LCBCUy5kcm9wV2hpbGUgaXNTcGFjZSBzKQoKcmVhZEludCA6OiBQYXJzZXIgSW50CnJlYWRJbnQgPSBTdGF0ZVQgJCBmbWFwIHNraXBTcGFjZXMgLiBCUy5yZWFkSW50CgotLS0tLUVORCBQQVJTRVItLS0tLS0KCi0tLS0tQkVHSU4gQ09NQklOQVRPUlMtLS0tLQoKcmVhZFBhaXIgOjogUGFyc2VyIChJbnQsIEludCkKcmVhZFBhaXIgPSBkbwogIHggPC0gcmVhZEludAogIHkgPC0gcmVhZEludAogIHJldHVybiAoeCwgeSkKCnJlYWRJbnRMaXN0IDo6IEludCAtPiBQYXJzZXIgW0ludF0KcmVhZEludExpc3QgbiA9IHNlcXVlbmNlICAkIHJlcGxpY2F0ZSBuIHJlYWRJbnQKCnJlYWRTaXplZExpc3QgOjogUGFyc2VyIFtJbnRdCnJlYWRTaXplZExpc3QgPSByZWFkSW50ID4+PSByZWFkSW50TGlzdAoKLS0tLS1FTkQgQ09NQklOQVRPUlMtLS0tLQoKLS0gVGVzdGluZy4uLgoKZGF0YSBTdHJ1Y3QgPSBTdHJ1Y3QgSW50IChJbnQsIEludCkgW0ludF0KICAgICAgICAgICAgZGVyaXZpbmcgKFNob3cpCgpvckZhaWwgPSBmcm9tTWF5YmUgKEJTLnBhY2sgIkVQSUMgRkFJTCEhIVxuIikKCnBhcnNlUHJpbnQgOjogU2hvdyBhID0+IFBhcnNlciBhIC0+IChCUy5CeXRlU3RyaW5nIC0+IEJTLkJ5dGVTdHJpbmcpCnBhcnNlUHJpbnQgcGFyc2VNZSA9IG9yRmFpbCAuIGV2YWxTdGF0ZVQgKGRvIHggPC0gcGFyc2VNZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCBCUy5wYWNrICQgc2hvdyB4ICsrICJcbiIpCgp0ZXN0UGFpciA9IHBhcnNlUHJpbnQgKFN0cnVjdCA8JD4gcmVhZEludCA8Kj4gcmVhZFBhaXIgPCo+IHJlYWRTaXplZExpc3QpCgptYWluID0gQlMuaW50ZXJhY3QgdGVzdFBhaXI=