Learn You Some Erlang / zoo.erl

-module(zoo).
-export([main/0]).

-type red_panda() :: bamboo | birds | eggs | berries.
-type squid() :: sperm_whale.
-type food(T) :: stream:generator(T).

-spec feeder(red_panda) -> food(red_panda());
            (squid) -> food(squid()).
feeder(red_panda) ->
    F = fun(_) ->
        element(random:uniform(4), {bamboo,birds,eggs,berries})
    end,
    stream:make(F, red_panda);
feeder(squid) ->
    F = fun(_) -> sperm_whale end,
    stream:make(F, squid).

-spec feed(red_panda, food(red_panda())) -> {red_panda(), food(red_panda())};
          (squid, food(squid())) -> {squid(), food(squid())}.
feed(red_panda, Stream) -> stream:next(Stream);
feed(squid, Stream) -> stream:next(Stream).

main() ->
    <<A:32, B:32, C:32>> = crypto:rand_bytes(12),
    random:seed(A,B,C),
    %% The Zoo bought red pandas!
    FeederRP = feeder(red_panda),
    feed(red_panda, FeederRP),
    %% The zoo bought a squid!
    FeederSquid = feeder(squid),
    feed(squid, FeederSquid),
    %% What happens if we mix the feeders?!
    feed(squid, FeederRP),
    feed(red_panda, FeederSquid).
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.