Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

The whole options module should be inline #14417

Merged
merged 3 commits into from
May 21, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added build.out
Binary file not shown.
29 changes: 14 additions & 15 deletions lib/pure/options.nim
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ type
UnpackDefect* = object of Defect
UnpackError* {.deprecated: "See corresponding Defect".} = UnpackDefect

proc option*[T](val: T): Option[T] =
proc option*[T](val: T): Option[T] {.inline.} =
## Can be used to convert a pointer type (`ptr` or `ref` or `proc`) to an option type.
## It converts `nil` to `None`.
##
Expand All @@ -98,7 +98,7 @@ proc option*[T](val: T): Option[T] =
when T isnot SomePointer:
result.has = true

proc some*[T](val: T): Option[T] =
proc some*[T](val: T): Option[T] {.inline.} =
## Returns an `Option` that has the value `val`.
##
## See also:
Expand All @@ -121,7 +121,7 @@ proc some*[T](val: T): Option[T] =
result.has = true
result.val = val

proc none*(T: typedesc): Option[T] =
proc none*(T: typedesc): Option[T] {.inline.} =
## Returns an `Option` for this type that has no value.
##
## See also:
Expand All @@ -136,7 +136,7 @@ proc none*(T: typedesc): Option[T] =
# the default is the none type
discard

proc none*[T]: Option[T] =
proc none*[T]: Option[T] {.inline.} =
## Alias for `none(T) proc <#none,typedesc>`_.
none(T)

Expand Down Expand Up @@ -167,7 +167,7 @@ proc isNone*[T](self: Option[T]): bool {.inline.} =
else:
not self.has

proc get*[T](self: Option[T]): T =
proc get*[T](self: Option[T]): T {.inline.} =
## Returns contents of an `Option`. If it is `None`, then an exception is
## thrown.
##
Expand All @@ -185,7 +185,7 @@ proc get*[T](self: Option[T]): T =
raise newException(UnpackError, "Can't obtain a value from a `none`")
self.val

proc get*[T](self: Option[T], otherwise: T): T =
proc get*[T](self: Option[T], otherwise: T): T {.inline.} =
## Returns the contents of the `Option` or an `otherwise` value if
## the `Option` is `None`.
runnableExamples:
Expand All @@ -200,7 +200,7 @@ proc get*[T](self: Option[T], otherwise: T): T =
else:
otherwise

proc get*[T](self: var Option[T]): var T =
proc get*[T](self: var Option[T]): var T {.inline.} =
## Returns contents of the `var Option`. If it is `None`, then an exception
## is thrown.
runnableExamples:
Expand All @@ -215,7 +215,7 @@ proc get*[T](self: var Option[T]): var T =
raise newException(UnpackError, "Can't obtain a value from a `none`")
return self.val

proc map*[T](self: Option[T], callback: proc (input: T)) =
proc map*[T](self: Option[T], callback: proc (input: T)) {.inline.} =
## Applies a `callback` function to the value of the `Option`, if it has one.
##
## See also:
Expand All @@ -239,7 +239,7 @@ proc map*[T](self: Option[T], callback: proc (input: T)) =
if self.isSome:
callback(self.val)

proc map*[T, R](self: Option[T], callback: proc (input: T): R): Option[R] =
proc map*[T, R](self: Option[T], callback: proc (input: T): R): Option[R] {.inline.} =
## Applies a `callback` function to the value of the `Option` and returns an
## `Option` containing the new value.
##
Expand All @@ -266,7 +266,7 @@ proc map*[T, R](self: Option[T], callback: proc (input: T): R): Option[R] =
else:
none(R)

proc flatten*[A](self: Option[Option[A]]): Option[A] =
proc flatten*[A](self: Option[Option[A]]): Option[A] {.inline.} =
## Remove one level of structure in a nested `Option`.
runnableExamples:
let a = some(some(42))
Expand All @@ -278,7 +278,7 @@ proc flatten*[A](self: Option[Option[A]]): Option[A] =
none(A)

proc flatMap*[A, B](self: Option[A],
callback: proc (input: A): Option[B]): Option[B] =
callback: proc (input: A): Option[B]): Option[B] {.inline.} =
## Applies a `callback` function to the value of the `Option` and returns an
## `Option` containing the new value.
##
Expand Down Expand Up @@ -308,7 +308,7 @@ proc flatMap*[A, B](self: Option[A],

map(self, callback).flatten()

proc filter*[T](self: Option[T], callback: proc (input: T): bool): Option[T] =
proc filter*[T](self: Option[T], callback: proc (input: T): bool): Option[T] {.inline.} =
## Applies a `callback` to the value of the `Option`.
##
## If the `callback` returns `true`, the option is returned as `Some`.
Expand All @@ -333,7 +333,7 @@ proc filter*[T](self: Option[T], callback: proc (input: T): bool): Option[T] =
else:
self

proc `==`*(a, b: Option): bool =
proc `==`*(a, b: Option): bool {.inline.} =
## Returns `true` if both `Option`s are `None`,
## or if they are both `Some` and have equal values.
runnableExamples:
Expand Down Expand Up @@ -363,7 +363,7 @@ proc `$`*[T](self: Option[T]): string =
else:
result = "None[" & name(T) & "]"

proc unsafeGet*[T](self: Option[T]): T =
proc unsafeGet*[T](self: Option[T]): T {.inline.}=
## Returns the value of a `some`. Behavior is undefined for `none`.
##
## **Note:** Use it only when you are **absolutely sure** the value is present
Expand Down Expand Up @@ -513,4 +513,3 @@ when isMainModule:
test "Ref type with overloaded `==`":
let p = some(RefPerson.new())
check p.isSome