type storage = int;

type parameter =
  Increment (int)
| Decrement (int)
| Reset;

type return = (list (operation), storage);

(* Two entrypoints *)

let add = ((store, delta) : (storage, int)) : storage => store + delta;

let sub = ((store, delta) : (storage, int)) : storage => store - delta;

(* Main access point that dispatches to the entrypoints according to
   the smart contract parameter. *)

let main = ((action, store) : (parameter, storage)) : return => {
 (([] : list (operation)),    // No operations
 (switch (action) {
  | Increment (n) => add ((store, n))
  | Decrement (n) => sub ((store, n))
  | Reset         => 0
  }))
};
