@@ -6,27 +6,44 @@ import Effect.Ref as Ref
66import Wire.Event (Event )
77import Wire.Event as Event
88
9- type Signal a
10- = { event :: Event a
11- , modify :: ( a -> a ) -> Effect Unit
12- , read :: Effect a
13- , write :: a -> Effect Unit
14- , cancel :: Effect Unit
15- }
16-
17- create :: forall a . a -> Effect ( Signal a )
9+ newtype Signal a
10+ = Signal
11+ { event :: Event a
12+ , modify :: ( a -> a ) -> Effect Unit
13+ , read :: Effect a
14+ , write :: a -> Effect Unit
15+ }
16+
17+ create :: forall a . a -> Effect { signal :: Signal a , cancel :: Effect Unit }
1818create init = do
1919 value <- Ref .new init
2020 inner <- Event .create
2121 let
22- read = Ref .read value
22+ read' = Ref .read value
2323
24- write a = modify (const a)
24+ write' a = modify' (const a)
2525
26- modify f = Ref .modify f value >>= inner.push
26+ modify' f = Ref .modify f value >>= inner.push
2727
28- event =
28+ event' =
2929 Event .makeEvent \emit -> do
3030 Ref .read value >>= emit
3131 Event .subscribe inner.event emit
32- pure { event, read, write, modify, cancel: inner.cancel }
32+
33+ signal = Signal { event: event', read: read', write: write', modify: modify' }
34+ pure { signal, cancel: inner.cancel }
35+
36+ event :: forall a . Signal a -> Event a
37+ event (Signal s) = s.event
38+
39+ read :: forall a . Signal a -> Effect a
40+ read (Signal s) = s.read
41+
42+ write :: forall a . a -> Signal a -> Effect Unit
43+ write a (Signal s) = s.write a
44+
45+ modify :: forall a . (a -> a ) -> Signal a -> Effect Unit
46+ modify f (Signal s) = s.modify f
47+
48+ distinct :: forall a . Eq a => Signal a -> Signal a
49+ distinct (Signal s) = Signal s { event = Event .distinct s.event }
0 commit comments