Skip to content

Observable: Operators

.map(fn)

Use .map(fn) to transform the value of a single Observable into another derived value.

from nuiitivet.observable import Observable

age = Observable(20)
is_adult = age.map(lambda x: x >= 18)

is_adult.subscribe(lambda v: print(f"Adult: {v}"))
age.value = 15  # Adult: False
age.value = 20  # Adult: True

.combine(other).compute(fn)

Use this pattern when you need to compute a derived value from exactly two Observables.

price = Observable(100)
quantity = Observable(2)
total = price.combine(quantity).compute(lambda p, q: p * q)

combine(a, b, ...).compute(fn)

Use this form to combine three or more Observables in a single derived computation.

from nuiitivet.observable import Observable, combine

price = Observable(100)
quantity = Observable(2)
discount = Observable(0.1)

total = combine(price, quantity, discount).compute(
    lambda p, q, d: p * q * (1 - d)
)

Observable.compute(fn)

Observable.compute(fn) is useful for complex logic and conditional branches where dependencies may change dynamically.

class Cart:
    def __init__(self):
        self.show_detail = Observable(True)
        self.price = Observable(100)
        self.quantity = Observable(2)

        self.display = Observable.compute(lambda: (
            f"¥{self.price.value * self.quantity.value:,}"
            if self.show_detail.value
            else "---"
        ))

Operator Selection Guide

# 1:1 transformation
is_adult = age.map(lambda x: x >= 18)

# 2 observables
subtotal = price.combine(quantity).compute(lambda p, q: p * q)

# 3+ observables
total = combine(price, quantity, discount).compute(
    lambda p, q, d: p * q * (1 - d)
)

# complex branching
display = Observable.compute(lambda: (
    self.tax_included.value if self.show_tax.value
    else self.tax_excluded.value
))

Performance Note

  • .map() and .combine() internally leverage compute-like mechanisms.
  • Prefer explicit dependencies (map, combine) for readability.
  • Use Observable.compute() for branching and complex dependency paths.

Next Steps