bodil/purescript-signal

Atomic update

Open

#55 aberto em 9 de dez. de 2016

Ver no GitHub
 (1 comment) (3 reactions) (0 assignees)PureScript (41 forks)github user discovery
enhancementhelp wanted

Métricas do repositório

Stars
 (260 stars)
Métricas de merge de PR
 (Nenhuma PRs mesclada em 30d)

Description

Is it possible to implement atomic updates, so that if a signal receives multiple updates from its dependent signals, it will only emit one signal value if these updates are originally from the same signal update?

For example, let's say signal b and signal c depend on signal a, and signal d depends on both b and c. If there is new signal value sent to signal a, it should trigger only one signal. This is the dependency graph:

    a
  /   \
 b     c
  \   /
    d

As if right now, it triggers twice.

main = do
  cn <- channel 1
  let a = subscribe cn
  let b = (_ + 1) <$> a
  let c = (_ + 3) <$> a
  let d = (+) <$> b <*> c
  let ds = (\x -> [x]) <$> d
  let all = foldp (<>) [] ds
  send cn 100
  runSignal (all ~> show >>> log)
* Build successful.
[204,105,6]

^^^^^^^^^^^ Expect to be [204, 6], but got [204,105,6]. 204 = (100 + 1) + (100 + 3) 105 = (100 + 1) + (4) 6 = (1 + 1) + (1 + 3)

105 is an intermediate value that could be ignored if supports atomic updates.

Atomic updates is useful for UI rendering optimization. If a view's rendering depends on multiple signals, and they are all updated by the same signal value from their dependencies, atomic updates can make sure the view will only be rerendered once.

Guia do colaborador