Files
org-parser/src_v2/utils/fp.nim
Florian Schroedl 892eec10d5 Started refactor
2022-08-09 22:12:50 +02:00

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)