Module

Hylograph.Scene.Rules

Package
purescript-hylograph-simulation
Repository
afcondon/purescript-hylograph-simulation

Scene Rules

Common rule builders and transforms for scene orchestration.

Rules are applied with first-match-wins semantics (CSS-like cascade). Each rule has a selector (predicate) and a transform function.

This module provides:

  • Rule builders for creating rules
  • Common transforms (pin, unpin, setGridXY)
  • Rule application functions

#rule Source

rule :: forall node. String -> (node -> Boolean) -> (node -> node) -> NodeRule node

Build a rule with name, selector, and transform.

Example:

pinPackages :: NodeRule MyNode
pinPackages = rule "pinPackages" isPackage pinAtCurrent

#ruleAll Source

ruleAll :: forall node. String -> (node -> node) -> NodeRule node

Build a rule that applies to all nodes.

Example:

pinAll :: NodeRule MyNode
pinAll = ruleAll "pinAll" pinAtCurrent

#pinAtCurrent Source

pinAtCurrent :: forall r. { fx :: Nullable Number, fy :: Nullable Number, x :: Number, y :: Number | r } -> { fx :: Nullable Number, fy :: Nullable Number, x :: Number, y :: Number | r }

Pin a node at its current position.

Sets fx = x, fy = y so the node won't move during simulation.

Type signature uses row polymorphism - works with any node type that has the required fields.

#pinAt Source

pinAt :: forall r. Number -> Number -> { fx :: Nullable Number, fy :: Nullable Number, x :: Number, y :: Number | r } -> { fx :: Nullable Number, fy :: Nullable Number, x :: Number, y :: Number | r }

Pin a node at a specific position.

Sets x, y, fx, fy all to the given coordinates.

#unpin Source

unpin :: forall r. { fx :: Nullable Number, fy :: Nullable Number | r } -> { fx :: Nullable Number, fy :: Nullable Number | r }

Unpin a node (clear fx/fy).

Allows the node to move freely under force simulation.

#setPosition Source

setPosition :: forall r. Number -> Number -> { x :: Number, y :: Number | r } -> { x :: Number, y :: Number | r }

Set a node's position without pinning.

Updates x, y but leaves fx, fy unchanged.

#applyRules Source

applyRules :: forall node. Array (NodeRule node) -> Array node -> Array node

Apply rules to an array of nodes (first matching rule wins).

For each node, finds the first rule whose selector matches, then applies that rule's transform. If no rule matches, the node is returned unchanged.

This is CSS-like cascade semantics - rule order matters.

#applyFirstMatch Source

applyFirstMatch :: forall node. Array (NodeRule node) -> node -> node

Apply the first matching rule to a single node.

Returns the node unchanged if no rule matches.

Re-exports from Hylograph.Scene.Types

#NodeRule Source

type NodeRule node = { apply :: node -> node, name :: String, select :: node -> Boolean }

A rule that selects nodes and applies a transform.

Rules are applied with first-match-wins semantics (like CSS cascade). If multiple rules match a node, only the first one applies.

Example:

pinPackages :: NodeRule MyNode
pinPackages =
  { name: "pinPackages"
  , select: \n -> n.nodeType == Package
  , apply: \n -> n { fx = notNull n.x, fy = notNull n.y }
  }