packages feed

gruff-examples-0.3.1: src/Convert/Gruff.hs

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