blob: 80bfa4bae8c980ed640f315fff67d467555ead53 (
plain) (
tree)
|
|
discard """
output: '''some(str), some(5), none
some(5!)
some(10)
34'''
"""
import strutils
type Option[A] = object
case isDefined*: bool
of true:
value*: A
of false:
nil
proc some[A](value: A): Option[A] =
Option[A](isDefined: true, value: value)
proc none[A](): Option[A] =
Option[A](isDefined: false)
proc `$`[A](o: Option[A]): string =
if o.isDefined:
"some($1)" % [$o.value]
else:
"none"
let x = some("str")
let y = some(5)
let z = none[int]()
echo x, ", ", y, ", ", z
proc intOrString[A : int | string](o: Option[A]): Option[A] =
when A is int:
some(o.value + 5)
elif A is string:
some(o.value & "!")
else:
o
#let a1 = intOrString(none[String]())
let a2 = intOrString(some("5"))
let a3 = intOrString(some(5))
#echo a1
echo a2
echo a3
# bug #10033
type
Token = enum
Int,
Float
Base = ref object of RootObj
case token: Token
of Int:
bInt: int
of Float:
bFloat: float
Child = ref object of Base
let c = new Child
c.token = Int
c.bInt = 34
echo c.bInt
|