38 lines
863 B
Nim
38 lines
863 B
Nim
import std/sugar
|
|
import fp/maybe
|
|
import results
|
|
|
|
func last*[T](xs: seq[T]): Maybe[T] =
|
|
if xs.len == 0:
|
|
nothing(T)
|
|
else:
|
|
just(xs[^1])
|
|
|
|
template isSome*(self: Result): bool = self.isOk()
|
|
template isNone*(self: Result): bool = self.isErr()
|
|
|
|
proc findMaybe*[T](xs: seq[T], fn: T -> bool): Maybe[T] =
|
|
for x in xs:
|
|
if fn(x):
|
|
return Just(x)
|
|
return Nothing[T]()
|
|
|
|
proc findMaybeFn*[T, B](fns: seq[T {.nimcall.} -> Maybe[B]], val: T): Maybe[B] =
|
|
for fn in fns:
|
|
let res = fn(val)
|
|
if res.isDefined():
|
|
return res
|
|
return Nothing[B]()
|
|
|
|
proc notNegative*[int](x: Maybe[int]): Maybe[int] =
|
|
## Maps nil object to nothing
|
|
x.filter(i => i >= 0)
|
|
|
|
when isMainModule:
|
|
echo @[
|
|
(x: int) => (if x == 2: Just("foo") else: Nothing[string]()),
|
|
].findMaybeFn(2)
|
|
|
|
assert last(@[1,2,3]) == just(3)
|
|
assert last[int](@[]) == nothing(int)
|