d3js-0.1.0.0: D3JS/Type.hs
{-# LANGUAGE OverloadedStrings, GADTs, NoImplicitPrelude, ExistentialQuantification, FlexibleInstances #-}
module D3JS.Type where
import Data.Text (Text)
import qualified Data.Text as T
import Prelude hiding ((.),id)
import Control.Category
-- * Types
-- |This represents a method chain with an initial type of `a` and a final type of `b`
-- Chains are composable by functions in "Control.Category" module.
-- See "D3JS.Chart" for examples.
data Chain a b where
Val :: Var -> Chain () b
Val' :: (Reifiable b) => b -> Chain () b
Val'' :: Var' b -> Chain () b
Func :: JSFunc a params b -> Chain a b
Concat :: Chain c b -> Chain a c -> Chain a b
Nil :: Chain a a
-- | Chain a b behaves just like (a -> b).
-- Val Var is the starting point of chain (= constant),
-- and Nil is the termination of chain.
instance Category Chain where
id = Nil
(.) = Concat
type Var = Text
type Selector = Text
-- data D3Root = D3Root
data Data1D = Data1D [Double]
data Data2D = Data2D [(Double,Double)]
data Selection = Selection
data SelData a = SelData
data Transition = Transition -- this is just used as a tag for chaining functions with a type.
-- |Instances of Reifiable can generate a JavaScript code fragment.
class Reifiable a where
reify :: a -> Text
-- |Used just as a tag for typing method chains. Used in "D3JS.Func".
class Sel a
instance Sel Selection
instance Sel (SelData a)
-- |Used just as a tag for typing method chains. Used in "D3JS.Func".
class Sel2 a
instance Sel2 Selection
instance Sel2 (SelData a)
instance Sel2 (Chain () b)
-- * For internal use
-- | Function call
data JSFunc a c b = JSFunc FuncName [JSParam] -- name and params
type FuncName = Text
-- | Parameter for a function call
data JSParam = ParamVar Var | PText Text | PDouble Double | PFunc FuncDef
-- | Function definition used for a callback.
data FuncDef = FuncTxt Text | forall r. FuncExp (NumFunc r)
-- | Representation of JavaScript function for a callback.
data NumFunc r where
NInt :: Int -> NumFunc Int
NDouble :: Double -> NumFunc Double
Add :: NumFunc r -> NumFunc r -> NumFunc r
Subt :: NumFunc r -> NumFunc r -> NumFunc r
Mult :: NumFunc r -> NumFunc r -> NumFunc r
Div :: NumFunc r -> NumFunc r -> NumFunc r
Index :: Int -> NumFunc [r] -> NumFunc r
Field :: Text -> NumFunc a -> NumFunc r
NVar :: Var -> NumFunc r
DataParam :: NumFunc r
-- |This should not be used directly by users. Users should use 'assign' to get a variable instead.
data Var' dat = Var' Var -- typed variables