Skip to content
Open
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
1 change: 1 addition & 0 deletions docs/src/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ Try.unwrap_err
Try.oktype
Try.errtype
Try.map
Try.transpose
```

## Short-circuit evaluation
Expand Down
1 change: 1 addition & 0 deletions src/Try.jl
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ struct IsOkError <: InternalPrelude.Exception
end

function map end
function transpose end

macro and_return end
function var"@?" end
Expand Down
17 changes: 17 additions & 0 deletions src/docs/transpose.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
Try.transpose(result_of_maybe) -> maybe_of_result
Try.transpose(maybe_of_result) -> result_of_maybe

Transpose `Union{Ok,Err}` wrapped in `Union{Some,Nothing}` and vice versa.

# Extended help
## Examples
```julia
using Try

@assert Try.transpose(Ok(nothing)) === nothing
@assert Try.transpose(Ok(Some(1))) === Some(Ok(1))
@assert Try.transpose(Err(:error)) === Some(Err(:error))
@assert Try.transpose(Some(Ok(1))) === Try.Ok(Some(1))
@assert Try.transpose(Some(Err(:error))) === Try.Err(:error)
@assert Try.transpose(nothing) === Try.Ok()
```
21 changes: 21 additions & 0 deletions src/tools.jl
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,24 @@ TryMap(::Type{T}) where {T} = TryMap{Type{T}}(T)
(f::TryMap)(x) = Try.map(f.f, x)

Try.map(f::F) where {F} = TryMap(f)

function Try.transpose(ok::Ok)
maybe = Try.unwrap(ok)::Union{Some,Nothing}
if maybe === nothing
nothing
else
Some(Ok(something(maybe)))
end
end
Try.transpose(err::Err) = Some(err)

Try.transpose(::Nothing) = Ok()
function Try.transpose(some::Some)
result = something(some)
if Try.isok(result)
Ok(Some(Try.unwrap(result)))
else
# Need to "forget" about any Ok value type information:
Err(Try.unwrap_err(result))
end
end
15 changes: 15 additions & 0 deletions test/TryTests/src/test_tools.jl
Original file line number Diff line number Diff line change
Expand Up @@ -151,4 +151,19 @@ function test_map()
@test Try.map(x -> x + 1, nothing) === nothing
end

function test_double_transpose()
@testset for x in [
# Result-of-Maybe
Ok(Some(1)),
Ok(nothing),
Err(:error),
# Maybe-of-Result
Some(Ok(1)),
Some(Err(:error)),
nothing,
]
@test Try.transpose(Try.transpose(x)) == x
end
end

end # module