Skip to content

Commit 5f0274a

Browse files
authored
Made Signal a newtype, so it's easier to pass around (#4)
1 parent ecf232f commit 5f0274a

File tree

1 file changed

+31
-14
lines changed

1 file changed

+31
-14
lines changed

src/Wire/Signal.purs

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,44 @@ import Effect.Ref as Ref
66
import Wire.Event (Event)
77
import 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 }
1818
create 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

Comments
 (0)