module D3JS.Func where
import D3JS.Type
import Data.List
import Data.Text (Text)
import qualified Data.Text as T
import Prelude hiding ((.),id)
import Control.Category
d3Root :: Chain () Selection
d3Root = Val "d3"
select :: Selector -> Chain Selection Selection
select = funct1 "select"
selectAll :: Sel2 a => Selector -> Chain a Selection
selectAll = funct1 "selectAll"
dataD3 :: Var' r -> Chain Selection (SelData r)
dataD3 (Var' d) = func "data" [ParamVar d]
enter :: Chain (SelData r) (SelData r)
enter = func "enter" []
exit :: (Sel a) => Chain a a
exit = func "exit" []
appendD3 :: Text -> Chain (SelData a) (SelData a)
appendD3 = funct1 "append"
attr :: Text -> JSParam -> Chain a a
attr key val = func' "attr" [PText key, val]
attrf :: Text -> JSParam -> Chain a a
attrf key val = func' "attr" [PText key, val]
attrt :: Text -> Text -> Chain a a
attrt key val = attr key (PText val)
attrd :: Text -> Double -> Chain a a
attrd key val = attr key (PDouble val)
style :: Text -> Text -> Chain a a
style key val = func' "style" [PText key, PText val]
classed :: [Text] -> Chain a a
classed kls = func' "classed" [PText (T.intercalate " " kls)]
property :: Text -> Text -> Chain a a
property key val = func' "property" [PText key, PText val]
text :: Text -> Chain a a
text val = func' "text" [PText val]
html :: Text -> Chain a a
html val = func' "html" [PText val]
width :: Double -> Chain a a
width v = attr "width" (PDouble v)
height :: Double -> Chain a a
height v = attr "height" (PDouble v)
transform = attrt "transform"
transform' :: Double -> Double -> Double -> Double -> Double -> Chain a a
transform' tx ty sx sy r =
attrt "transform" $
T.concat ["translate(",f tx, " ",f ty,") scale(",f sx, " ", f sy, ") rotate(",f r, ")"]
where
f v = T.pack $ show v
opacity :: Sel a => Double -> Chain a a
opacity = attrd "fill-opacity"
fill :: Sel a => Text -> Chain a a
fill = style "fill"
transition :: (Sel2 a) => Chain a Transition
transition = func "transition" []
transition' :: (Sel2 a) => Double -> Chain a Transition
transition' d = transition >>> funcd1 "duration" d
delay :: JSParam -> Chain Transition Transition
delay v = func "delay" [v]
func :: FuncName -> [JSParam] -> Chain a b
func name params = Func $ JSFunc name params
funct1 name t = func name [PText t]
funcd1 name v = func name [PDouble v]
func' :: FuncName -> [JSParam] -> Chain a a
func' = func
funcTxt :: Text -> JSParam
funcTxt = PFunc . FuncTxt
funcExp = PFunc . FuncExp