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)