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

enum Option {
    Some(int),
    None,
}

func Option_NewSome(value: int) -> Option {
    let o: Option = Option { tag: Option_Some };
    o.data.Some_0 = value;
    return o;
}

func Option_NewNone() -> Option {
    return Option { tag: Option_None };
}

func Option_IsSome(o: Option) -> bool {
    return o.tag == Option_Some;
}

func Option_IsNone(o: Option) -> bool {
    return o.tag == Option_None;
}

func Option_Unwrap(o: Option) -> int {
    if o.tag != Option_Some {
        PrintLine("panic: unwrap on None");
        return 0;
    }
    return o.data.Some_0;
}

func Option_UnwrapOr(o: Option, fallback: int) -> int {
    if o.tag == Option_Some {
        return o.data.Some_0;
    }
    return fallback;
}

}
