File: tyaoption.nim

package info (click to toggle)
nim 0.19.4-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 462,356 kB
  • sloc: sh: 11,089; ansic: 4,699; makefile: 706; python: 309; sql: 297; asm: 141; xml: 13
file content (70 lines) | stat: -rw-r--r-- 1,065 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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