Skip to content

Instantly share code, notes, and snippets.

@evancz
Last active August 29, 2015 14:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save evancz/79abe843c4bd54010b19 to your computer and use it in GitHub Desktop.
Save evancz/79abe843c4bd54010b19 to your computer and use it in GitHub Desktop.

Potential Signal API

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment