tyaoption.nim 804 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. discard """
  2. output: '''some(str), some(5), none
  3. some(5!)
  4. some(10)'''
  5. """
  6. import strutils
  7. type Option[A] = object
  8. case isDefined*: bool
  9. of true:
  10. value*: A
  11. of false:
  12. nil
  13. proc some[A](value: A): Option[A] =
  14. Option[A](isDefined: true, value: value)
  15. proc none[A](): Option[A] =
  16. Option[A](isDefined: false)
  17. proc `$`[A](o: Option[A]): string =
  18. if o.isDefined:
  19. "some($1)" % [$o.value]
  20. else:
  21. "none"
  22. let x = some("str")
  23. let y = some(5)
  24. let z = none[int]()
  25. echo x, ", ", y, ", ", z
  26. proc intOrString[A : int | string](o: Option[A]): Option[A] =
  27. when A is int:
  28. some(o.value + 5)
  29. elif A is string:
  30. some(o.value & "!")
  31. else:
  32. o
  33. #let a1 = intOrString(none[String]())
  34. let a2 = intOrString(some("5"))
  35. let a3 = intOrString(some(5))
  36. #echo a1
  37. echo a2
  38. echo a3