type
Maybe* [T] = object {. final .}
case hasValue*: bool
of true: value*: T
else: discard
proc Just* [T](aValue: T): Maybe[T] {. inline .} =
result = Maybe[T](hasValue: true, value: aValue)
template template_Just* [T](aValue: T): Maybe[T] =
Maybe[T](hasValue: true, value: aValue)
proc Nothing* [T]: Maybe[T] {. inline .} =
result = Maybe[T](hasValue: false)
echo Just[int](1)
echo template_Just[int](1)
CnR5cGUKICBNYXliZSogW1RdID0gIG9iamVjdCB7LiBmaW5hbCAufQogICAgY2FzZSBoYXNWYWx1ZSo6IGJvb2wKICAgIG9mIHRydWU6IHZhbHVlKjogVAogICAgZWxzZTogZGlzY2FyZAoKCnByb2MgSnVzdCogW1RdKGFWYWx1ZTogVCk6IE1heWJlW1RdIHsuIGlubGluZSAufSA9CiAgcmVzdWx0ID0gTWF5YmVbVF0oaGFzVmFsdWU6IHRydWUsIHZhbHVlOiBhVmFsdWUpCgp0ZW1wbGF0ZSB0ZW1wbGF0ZV9KdXN0KiBbVF0oYVZhbHVlOiBUKTogTWF5YmVbVF0gPQogIE1heWJlW1RdKGhhc1ZhbHVlOiB0cnVlLCB2YWx1ZTogYVZhbHVlKQoKCnByb2MgTm90aGluZyogW1RdOiBNYXliZVtUXSB7LiBpbmxpbmUgLn0gPQogIHJlc3VsdCA9IE1heWJlW1RdKGhhc1ZhbHVlOiBmYWxzZSkKCgoKZWNobyBKdXN0W2ludF0oMSkKZWNobyB0ZW1wbGF0ZV9KdXN0W2ludF0oMSkK