Assuming we want to someday put Events
and Signal
in the same library, it might look like this. The only issue is that map
shows up twice.
module Signal where
-- EVENTS and SIGNALS
type Events a
type Signal a
subscribe : a -> Events a -> Signal a
destructure : Signal a -> (a, Events a)
state : (a -> s -> s) -> s -> Events a -> Signal s
sample : (a -> b -> c) -> Signal a -> Events b -> Events c
-- EVENTS
never : Events a
map : (a -> b) -> Events a -> Events b
merge : Events a -> Events a -> Events a
mergeMany : List (Events a) -> Events a
filter : (a -> Bool) -> Events a -> Events a
filterMap : (a -> Maybe b) -> Events a -> Events b
-- SIGNALS
constant : a -> Signal a
timestamp : Signal a -> Signal (Time, a)
map : (a -> result) -> Signal a -> Signal result
map2 : (a -> b -> result) -> Signal a -> Signal b -> Signal result
map3 : (a -> b -> c -> result) -> Signal a -> Signal b -> Signal c -> Signal result
map4 : (a -> b -> c -> d -> result) -> Signal a -> Signal b -> Signal c -> Signal d -> Signal result
map5 : (a -> b -> c -> d -> e -> result) -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e -> Signal result
(<~) : (a -> b) -> Signal a -> Signal b
(~) : Signal (a -> b) -> Signal a -> Signal b
-- PORTS
type alias Port a =
{ address : Address a
, events : Events a
}
type Address a
send : Address a -> a -> Task x ()
forward : (a -> b) -> Address b -> Address a
message : Address a -> a -> Message