module Std::Result {
import Std::Io::{PrintLine};

enum Result {
    Ok(int),
    Err(String),
}

func Result_NewOk(value: int) -> Result {
    let r: Result = Result { tag: Result_Ok };
    r.data.Ok_0 = value;
    return r;
}

func Result_NewErr(msg: String) -> Result {
    let r: Result = Result { tag: Result_Err };
    r.data.Err_0 = msg;
    return r;
}

func Result_IsOk(r: Result) -> bool {
    return r.tag == Result_Ok;
}

func Result_IsErr(r: Result) -> bool {
    return r.tag == Result_Err;
}

func Result_Unwrap(r: Result) -> int {
    if r.tag != Result_Ok {
        PrintLine("panic: unwrap on Err");
        return 0;
    }
    return r.data.Ok_0;
}

func Result_UnwrapOr(r: Result, fallback: int) -> int {
    if r.tag == Result_Ok {
        return r.data.Ok_0;
    }
    return fallback;
}

}
