module Prelude where import Char (isLower) import TReadS _readField :: (Read a) => String -> String -> (String -> [(a->b,String)]) -> ReadS b _readField prefix name fun | (let h = head name in isLower h || h=='_') = -- ordinary fieldname \ r -> [(c a,s) | (c,r) <- fun r, (tok,r) <- lex r, tok == prefix, (tok,r) <- lex r, tok == name, (tok,r) <- lex r, tok == "=", (a,s) <- readsPrec 0 r] | otherwise = -- symbol fieldname \ r -> [(c a,s) | (c,r) <- fun r, (tok,r) <- lex r, tok == prefix, (tok,r) <- lex r, tok == "(", (tok,r) <- lex r, tok == init (tail name), -- trim parens off (tok,r) <- lex r, tok == ")", (tok,r) <- lex r, tok == "=", (a,s) <- readsPrec 0 r] _readFinal postfix reader = \ r -> [(c,s) | (c,r) <- reader r, (tok,s) <- lex r, tok == postfix ]