module Convert.Gruff (gruff) where import Convert.Common (readMay, image, Image) import Numeric (readSigned, readFloat) data AngledInternalAddress = Unangled Integer | Angled Integer Angle AngledInternalAddress deriving Read type Angle = Rational newtype R = R Rational instance Read R where readsPrec _ = map (\(x, s) -> (R x, s)) . readParen False (readSigned readFloat) data Gruff = Gruff { gAddress :: Maybe AngledInternalAddress , gIsland :: Maybe AngledInternalAddress , gChild :: Maybe [Angle] , gLowerAngle :: Maybe Angle , gUpperAngle :: Maybe Angle , gReal :: Maybe R , gImag :: Maybe R , gSize :: Maybe R } deriving Read gruff :: String -> Maybe Image gruff s = convert =<< readMay s convert :: Gruff -> Maybe Image convert Gruff{ gReal = Just (R re), gImag = Just (R im), gSize = Just (R sz) } = Just $ image re im (fromRational sz) convert _ = Nothing