module D3JS.Reify where
import Data.Text (Text)
import qualified Data.Text as T
import D3JS.Type
instance Reifiable Var where
reify t = t
instance Reifiable (Chain a b) where
reify (Val name) = name
reify (Val' v) = reify v
reify (Val'' (Var' n)) = n
reify (Concat Nil g) = reify g
reify (Concat f g) = T.concat [reify g,".",reify f]
reify (Func f) = reify f
reify Nil = ""
instance Reifiable Data1D where
reify (Data1D ps) = surround $ T.intercalate "," $ map show' ps
instance Reifiable Data2D where
reify (Data2D ps) = surround $ T.intercalate "," $ map (\(x,y) -> T.concat ["[",show' x,",",show' y,"]"]) ps
instance Reifiable (JSFunc a c b) where
reify (JSFunc name params) = T.concat [name,"(",T.intercalate "," $ map reify params,")"]
instance Reifiable JSParam where
reify (ParamVar name) = name
reify (PText t) = T.concat ["\"",t,"\""]
reify (PDouble d) = show' d
reify (PFunc (FuncTxt t)) = t
reify (PFunc (FuncExp f)) = T.concat["function(d){return ",reify f,";}"]
instance Reifiable (NumFunc r) where
reify DataParam = "d"
reify (Index i ns) = T.concat [reify ns,"[",show' i,"]"]
reify (Field name obj) = T.concat [reify obj,".",name]
show' :: (Show a) => a -> Text
show' = T.pack . show
surround s = T.concat ["[",s,"]"]