diff --git a/src/Wire/Signal.purs b/src/Wire/Signal.purs index 1b476e6..e0e80b3 100644 --- a/src/Wire/Signal.purs +++ b/src/Wire/Signal.purs @@ -9,9 +9,9 @@ import Wire.Event as Event newtype Signal a = Signal { event :: Event a - , modify :: (a -> a) -> Effect Unit , read :: Effect a , write :: a -> Effect Unit + , modify :: (a -> a) -> Effect Unit } create :: forall a. Eq a => a -> Effect { signal :: Signal a, cancel :: Effect Unit } @@ -19,13 +19,15 @@ create init = do value <- Ref.new init inner <- Event.create let - read' = Ref.read value - - write' a = modify' (const a) - modify' f = Ref.modify f value >>= inner.push - signal = Signal { event: Event.distinct inner.event, read: read', write: write', modify: modify' } + signal = + Signal + { event: Event.distinct inner.event + , read: Ref.read value + , write: modify' <<< const + , modify: modify' + } pure { signal, cancel: inner.cancel } subscribe :: forall a. Signal a -> Subscriber a -> Effect Canceler @@ -44,3 +46,12 @@ write a (Signal s) = s.write a modify :: forall a. (a -> a) -> Signal a -> Effect Unit modify f (Signal s) = s.modify f + +static :: forall a. a -> Signal a +static a = + Signal + { event: pure a + , read: pure a + , modify: const mempty + , write: const mempty + }