view light9/observable.py @ 1536:7a85229d07a0

currentgraphstate now returns readonly (not actually snapshotted) view of the graph, not a copy Ignore-this: 7db0291740fe8dee0ad25b24571b171b
author Drew Perttula <drewp@bigasterisk.com>
date Thu, 11 May 2017 05:20:15 +0000
parents 7445bcd3349d
children 7772cc48e016
line wrap: on
line source

import logging
log = logging.getLogger('observable')

class _NoNewVal(object):
    pass

class Observable(object):
    """
    like knockout's observable. Hopefully this can be replaced by a
    better python one

    compare with:
    http://knockoutjs.com/documentation/observables.html
    https://github.com/drpancake/python-observable/blob/master/observable/observable.py
    """
    def __init__(self, val):
        self.val = val
        self.subscribers = set()

    def __call__(self, newVal=_NoNewVal):
        if newVal is _NoNewVal:
            return self.val
        if newVal == self.val:
            log.debug("%r unchanged from %r", newVal, self.val)
            return
        self.val = newVal
        for s in self.subscribers:
            s(newVal)

    def subscribe(self, cb, callNow=True):
        """cb is called with new values, and also right now with the
        current value unless you opt out"""
        self.subscribers.add(cb)
        if callNow:
            cb(self.val)