
with TEXT_IO; use TEXT_IO;

procedure SHOPPING is
  
  type FOOD_STUFF is (SALAD, WINE, MEAT, SNICKERS);

  SS,WW,MM:FOOD_STUFF:=SNICKERS;

  task GET_SALAD is
    entry PAY(M:in INTEGER);
    entry COLLECT(S: out FOOD_STUFF);
  end GET_SALAD;
    
  task body GET_SALAD is
    CASH: INTEGER;
    FOOD: FOOD_STUFF;
  begin
    accept PAY(M: in INTEGER) do
      CASH:=M;
    end PAY;
    PUT_LINE("Bought salad...for $"&INTEGER'IMAGE(CASH)); -- instead of M
    accept COLLECT(S:out FOOD_STUFF) do
      S:=SALAD;
    end COLLECT;
  end GET_SALAD;

  task GET_WINE is
    entry PAY(M:in INTEGER);
    entry COLLECT(S:out FOOD_STUFF);
  end GET_WINE;
    
  task body GET_WINE is
    CASH: INTEGER;
    FOOD: FOOD_STUFF;
  begin
    accept PAY(M: in INTEGER) do
      CASH:=M;
    end PAY;
    PUT_LINE("Bought wine...for $"&INTEGER'IMAGE(CASH)); -- instead of M
    accept COLLECT(S: out FOOD_STUFF) do
      S:=WINE;
    end COLLECT;
  end GET_WINE;
      
  task GET_MEAT is
    entry PAY(M:in INTEGER);
    entry COLLECT(S: out FOOD_STUFF);
  end GET_MEAT;
    
  task body GET_MEAT is
    CASH: INTEGER;
    FOOD: FOOD_STUFF;
  begin
    accept PAY(M: in INTEGER) do
      CASH:=M;
    end PAY;
    PUT_LINE("Bought meat...for $"&INTEGER'IMAGE(CASH)); -- instead of M
    accept COLLECT(S:out FOOD_STUFF) do
      S:=MEAT;
    end COLLECT;
  end GET_MEAT;
      
begin
  PUT_LINE("going shopping");
  GET_SALAD.PAY(50);                          
  GET_WINE.PAY(100);
  GET_MEAT.PAY(200);
  GET_SALAD.COLLECT(SS);
  put_line("Took delivery of "&food_stuff'image(ss));
  GET_WINE.COLLECT(WW);
  put_line("Took delivery of "&food_stuff'image(ww));
  GET_MEAT.COLLECT(MM);
  put_line("Took delivery of "&food_stuff'image(mm));
  PUT_LINE("finished shopping");
end;
                
