61 lines
1.2 KiB
ReasonML
61 lines
1.2 KiB
ReasonML
|
|
/* Primitive types */
|
|
type address = string;
|
|
type uint = int;
|
|
exception Abort;
|
|
|
|
type env =
|
|
{ mutable _caller : address
|
|
};
|
|
|
|
let env = { _caller: "" };
|
|
|
|
/* Builtin functions */
|
|
let caller() : address = env._caller;
|
|
let abort() = raise(Abort);
|
|
|
|
let call(who, fn) = {
|
|
env._caller = who;
|
|
let res = try(fn()) { | e => env._caller = ""; raise(e) };
|
|
env._caller = "";
|
|
res
|
|
};
|
|
|
|
/* Library functions */
|
|
let require(x) = x ? () : abort();
|
|
|
|
/* -- Managing contract state ------------------------------------------------ */
|
|
|
|
type state_rep('s) = { mutable state : option('s) };
|
|
|
|
let newStateRep() : state_rep('s) = { state: None };
|
|
|
|
exception UninitializedState;
|
|
exception ReinitializedState;
|
|
|
|
let getState(rep) =
|
|
switch(rep.state) {
|
|
| None => raise(UninitializedState)
|
|
| Some(s) => s
|
|
};
|
|
|
|
let setState(rep, s) =
|
|
switch(rep.state) {
|
|
| None => rep.state = Some(s)
|
|
| Some(_) => raise(ReinitializedState)
|
|
};
|
|
|
|
module type Contract = {
|
|
type state;
|
|
type args;
|
|
let init : args => state;
|
|
let stateRep : state_rep(state);
|
|
};
|
|
|
|
module Setup = (C : Contract) => {
|
|
let init(creator, args) =
|
|
setState(C.stateRep, call(creator, () => C.init(args)));
|
|
let reset() = C.stateRep.state = None;
|
|
};
|
|
|