Package

purescript-d3

Repository
pelotom/purescript-d3
License
MIT
Uploaded by
pelotom

Example

Here is the JavaScript code from part 1 of Mike Bostock's Let's Make a Bar Chart series of tutorials for D3:

var data = [4, 8, 15, 16, 23, 42];

var x = d3.scale.linear()
  .domain([0, d3.max(data)])
  .range([0, 420]);

d3.select(".chart")
  .selectAll("div")
    .data(data)
  .enter().append("div")
    .style("width", function(d) { return x(d) + "px"; })
    .text(function(d) { return d; });

And here is the PureScript equivalent:

array = [4, 8, 15, 16, 23, 42]

main = do

  x <- linearScale
    .. domain [0, max id array]
    .. range [0, 420]
    .. toFunction

  rootSelect ".chart"
    .. selectAll "div"
      .. bindData array
    .. enter .. append "div"
      .. style' "width" (\d -> show (x d) ++ "px")
      .. text' show

Note that .. is an alias for >>=. The fluent interface is just a poor man's programmable semicolon!

The PureScript D3 bindings statically enforce several properties of D3's selection semantics; for instance, if you were to remove the .. append "div" above you would get a type error, because the code following it would be attempting to set things on the unrealized nodes of an enter selection. Similarly, if you removed the .. bindData array line you would get a type error because you can only obtain an enter selection from an update selection (the selection produced by calling data in JavaScript or bindData in PureScript). In JavaScript you would have to wait until runtime to see these kinds of errors.

Selections also carry information about the type of data bound to them (if any). Until data is bound to a selection it is only possible to set constant attributes on it; afterwards you can use well-typed functions of the data.

You can find more examples here.

Development

You will need the following pre-requisites installed:

Once you have these installed you can run the following in a cloned repo:

npm install    # install dependencies from package.json
bower update   # install dependencies from bower.json
gulp           # compile the code

Module Graphics.D3.Base

D3

data D3 :: !

D3Eff

type D3Eff a = forall e. Eff (d3 :: D3 | e) a

Module Graphics.D3.Interpolate

Interpolator

data Interpolator :: * -> *

makeInterpolator

makeInterpolator :: forall a. (a -> a -> Number -> a) -> Interpolator a

Module Graphics.D3.Layout.Base

GraphLayout

class GraphLayout l where
  nodes :: forall a. Array a -> l -> D3Eff l
  links :: forall a. Array a -> l -> D3Eff l
  size :: forall d. { width :: Number, height :: Number | d } -> l -> D3Eff l

Module Graphics.D3.Layout.Force

ForceLayout

data ForceLayout :: *
Instances
GraphLayout ForceLayout

forceLayout

forceLayout :: D3Eff ForceLayout

linkDistance

linkDistance :: Number -> ForceLayout -> D3Eff ForceLayout

linkStrength

linkStrength :: Number -> ForceLayout -> D3Eff ForceLayout

friction

friction :: Number -> ForceLayout -> D3Eff ForceLayout

charge

charge :: Number -> ForceLayout -> D3Eff ForceLayout

chargeDistance

chargeDistance :: Number -> ForceLayout -> D3Eff ForceLayout

theta

theta :: Number -> ForceLayout -> D3Eff ForceLayout

gravity

gravity :: Number -> ForceLayout -> D3Eff ForceLayout

start

start :: ForceLayout -> D3Eff ForceLayout

alpha

alpha :: Number -> ForceLayout -> D3Eff ForceLayout

resume

resume :: ForceLayout -> D3Eff ForceLayout

stop

stop :: ForceLayout -> D3Eff ForceLayout

tick

tick :: ForceLayout -> D3Eff ForceLayout

onTick

onTick :: forall e r. (Foreign -> Eff e r) -> ForceLayout -> D3Eff ForceLayout

onDragStart

onDragStart :: forall e r. (Foreign -> Eff e r) -> ForceLayout -> D3Eff ForceLayout

drag

drag :: ForceLayout -> D3Eff ForceLayout

createDrag

createDrag :: forall s. ForceLayout -> Selection s -> D3Eff (Selection s)

Module Graphics.D3.Request

RequestError

type RequestError = { status :: Number, statusText :: String }

csv

csv :: forall e a. String -> (Either RequestError (Array Foreign) -> Eff (d3 :: D3 | e) a) -> D3Eff Unit

tsv

tsv :: forall e a. String -> (Either RequestError (Array Foreign) -> Eff (d3 :: D3 | e) a) -> D3Eff Unit

json

json :: forall e a. String -> (Either RequestError Foreign -> Eff (d3 :: D3 | e) a) -> D3Eff Unit

Module Graphics.D3.Scale

Scale

class Scale s where
  domain :: forall d r. Array d -> s d r -> D3Eff (s d r)
  range :: forall d r. Array r -> s d r -> D3Eff (s d r)
  copy :: forall d r. s d r -> D3Eff (s d r)
  toFunction :: forall d r. s d r -> D3Eff (d -> r)
Instances
Scale LinearScale
Scale PowerScale
Scale LogScale
Scale QuantizeScale
Scale QuantileScale
Scale ThresholdScale
Scale OrdinalScale

Quantitative

class Quantitative s where
  invert :: s Number Number -> D3Eff (Number -> Number)
  rangeRound :: Array Number -> s Number Number -> D3Eff (s Number Number)
  interpolate :: forall r. Interpolator r -> s Number r -> D3Eff (s Number r)
  clamp :: forall r. Boolean -> s Number r -> D3Eff (s Number r)
  nice :: forall r. Maybe Number -> s Number r -> D3Eff (s Number r)
  getTicks :: forall r. Maybe Number -> s Number r -> D3Eff (Array Number)
  getTickFormat :: forall r. Number -> Maybe String -> s Number r -> D3Eff (Number -> String)
Instances
Quantitative LinearScale
Quantitative PowerScale
Quantitative LogScale

LinearScale

data LinearScale :: * -> * -> *
Instances
Scale LinearScale
Quantitative LinearScale

PowerScale

data PowerScale :: * -> * -> *
Instances
Scale PowerScale
Quantitative PowerScale

LogScale

data LogScale :: * -> * -> *
Instances
Scale LogScale
Quantitative LogScale

QuantizeScale

data QuantizeScale :: * -> * -> *
Instances
Scale QuantizeScale

QuantileScale

data QuantileScale :: * -> * -> *
Instances
Scale QuantileScale

ThresholdScale

data ThresholdScale :: * -> * -> *
Instances
Scale ThresholdScale

OrdinalScale

data OrdinalScale :: * -> * -> *
Instances
Scale OrdinalScale

linearScale

linearScale :: forall r. D3Eff (LinearScale Number r)

powerScale

powerScale :: forall r. D3Eff (PowerScale Number r)

sqrtScale

sqrtScale :: forall r. D3Eff (PowerScale Number r)

logScale

logScale :: forall r. D3Eff (LogScale Number r)

quantizeScale

quantizeScale :: forall r. D3Eff (QuantizeScale Number r)

quantileScale

quantileScale :: forall r. D3Eff (QuantileScale Number r)

thresholdScale

thresholdScale :: forall r. D3Eff (ThresholdScale Number r)

ordinalScale

ordinalScale :: forall d r. D3Eff (OrdinalScale d r)

exponent

exponent :: forall r. Number -> PowerScale Number r -> D3Eff (PowerScale Number r)

base

base :: forall r. Number -> LogScale Number r -> D3Eff (LogScale Number r)

rangePoints

rangePoints :: forall d. Number -> Number -> Number -> OrdinalScale d Number -> D3Eff (OrdinalScale d Number)

rangeBands

rangeBands :: forall d. Number -> Number -> Number -> Number -> OrdinalScale d Number -> D3Eff (OrdinalScale d Number)

rangeRoundBands

rangeRoundBands :: forall d. Number -> Number -> Number -> Number -> OrdinalScale d Number -> D3Eff (OrdinalScale d Number)

rangeBand

rangeBand :: forall d. OrdinalScale d Number -> D3Eff Number

rangeExtent

rangeExtent :: forall d. OrdinalScale d Number -> D3Eff (Tuple Number Number)

Module Graphics.D3.Selection

Selection

data Selection :: * -> *
Instances
Appendable Selection
Existing Selection
Clickable (Selection a)

Update

data Update :: * -> *
Instances
Appendable Update
Existing Update

Enter

data Enter :: * -> *
Instances
Appendable Enter

Transition

data Transition :: * -> *
Instances
Existing Transition

Exit

type Exit d = Selection d

Void

data Void

AttrValue

class AttrValue a
Instances
AttrValue Number
AttrValue String

rootSelect

rootSelect :: String -> D3Eff (Selection Void)

rootSelectAll

rootSelectAll :: String -> D3Eff (Selection Void)

select

select :: forall d. String -> Selection d -> D3Eff (Selection d)

selectAll

selectAll :: forall d. String -> Selection d -> D3Eff (Selection Void)

bindData

bindData :: forall oldData newData. Array newData -> Selection oldData -> D3Eff (Update newData)

enter

enter :: forall d. Update d -> D3Eff (Enter d)

exit

exit :: forall d. Update d -> D3Eff (Exit d)

transition

transition :: forall s d. Existing s => s d -> D3Eff (Transition d)

delay

delay :: forall d. Number -> Transition d -> D3Eff (Transition d)

delay'

delay' :: forall d. (d -> Number) -> Transition d -> D3Eff (Transition d)

delay''

delay'' :: forall d. (d -> Number -> Number) -> Transition d -> D3Eff (Transition d)

duration

duration :: forall d. Number -> Transition d -> D3Eff (Transition d)

duration'

duration' :: forall d. (d -> Number) -> Transition d -> D3Eff (Transition d)

duration''

duration'' :: forall d. (d -> Number -> Number) -> Transition d -> D3Eff (Transition d)

Appendable

class Appendable s where
  append :: forall d. String -> s d -> D3Eff (Selection d)
Instances
Appendable Selection
Appendable Update
Appendable Enter

Existing

class Existing s where
  attr :: forall d v. AttrValue v => String -> v -> s d -> D3Eff (s d)
  attr' :: forall d v. AttrValue v => String -> (d -> v) -> s d -> D3Eff (s d)
  attr'' :: forall d v. AttrValue v => String -> (d -> Number -> v) -> s d -> D3Eff (s d)
  style :: forall d. String -> String -> s d -> D3Eff (s d)
  style' :: forall d. String -> (d -> String) -> s d -> D3Eff (s d)
  style'' :: forall d. String -> (d -> Number -> String) -> s d -> D3Eff (s d)
  text :: forall d. String -> s d -> D3Eff (s d)
  text' :: forall d. (d -> String) -> s d -> D3Eff (s d)
  text'' :: forall d. (d -> Number -> String) -> s d -> D3Eff (s d)
  remove :: forall d. s d -> D3Eff Unit
Instances
Existing Selection
Existing Update
Existing Transition

Clickable

class Clickable c where
  onClick :: forall eff r. (Foreign -> Eff eff r) -> c -> D3Eff c
  onDoubleClick :: forall eff r. (Foreign -> Eff eff r) -> c -> D3Eff c
Instances
Clickable (Selection a)

Module Graphics.D3.SVG.Axis

Axis

data Axis :: *

axis

axis :: D3Eff Axis

scale

scale :: forall s d. Scale s => s d Number -> Axis -> D3Eff Axis

orient

orient :: String -> Axis -> D3Eff Axis

ticks

ticks :: Number -> Axis -> D3Eff Axis

tickFormat

tickFormat :: String -> Axis -> D3Eff Axis

renderAxis

renderAxis :: forall s d. Existing s => Axis -> s d -> D3Eff (Selection d)

Module Graphics.D3.Time

TimeScale

data TimeScale :: * -> * -> *
Instances
Scale TimeScale

timeScale

timeScale :: forall r. D3Eff (TimeScale JSDate r)

Module Graphics.D3.Util

Magnitude

class Magnitude n
Instances
Magnitude Number
Magnitude JSDate

min'

min' :: forall d m. Magnitude m => (d -> m) -> Array d -> m

max'

max' :: forall d m. Magnitude m => (d -> m) -> Array d -> m

min

min :: forall m. Magnitude m => Array m -> m

max

max :: forall m. Magnitude m => Array m -> m

extent

extent :: forall m. Magnitude m => Array m -> Array m

extent'

extent' :: forall d m. Magnitude m => (d -> m) -> Array d -> Array m

(..)

infixl 4 Control.Bind.bind as ..

(...)

infixl 4 Data.Function.applyFlipped as ...