aboutsummaryrefslogtreecommitdiff
path: root/gen/result.erl
blob: b52caddd7c918ff72d703b5e2725b6658a0a9a2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
-module(result).
-compile(no_auto_import).
-include_lib("eunit/include/eunit.hrl").

-export([is_ok/1, is_error/1, map/2, map_error/2, flatten/1, flat_map/2, unwrap/2]).

is_ok(Result) ->
    case Result of
        {error, _} ->
            false;

        {ok, _} ->
            true
    end.

-ifdef(TEST).
is_ok_test() ->
    expect:true(is_ok({ok, 1})),
    expect:false(is_ok({error, 1})).
-endif.

is_error(Result) ->
    case Result of
        {ok, _} ->
            false;

        {error, _} ->
            true
    end.

-ifdef(TEST).
is_error_test() ->
    expect:false(is_error({ok, 1})),
    expect:true(is_error({error, 1})).
-endif.

map(Result, Fun) ->
    case Result of
        {ok, X} ->
            {ok, Fun(X)};

        {error, _} ->
            Result
    end.

-ifdef(TEST).
map_test() ->
    expect:equal(map({ok, 1}, fun(X) -> X + 1 end), {ok, 2}),
    expect:equal(map({error, 1}, fun(X) -> X + 1 end), {error, 1}).
-endif.

map_error(Result, Fun) ->
    case Result of
        {ok, _} ->
            Result;

        {error, Error} ->
            {error, Fun(Error)}
    end.

-ifdef(TEST).
map_error_test() ->
    expect:equal(map_error({ok, 1}, fun(X) -> X + 1 end), {ok, 1}),
    expect:equal(map_error({error, 1}, fun(X) -> X + 1 end), {error, 2}).
-endif.

flatten(Result) ->
    case Result of
        {ok, X} ->
            X;

        {error, Error} ->
            {error, Error}
    end.

-ifdef(TEST).
flatten_test() ->
    expect:equal(flatten({ok, {ok, 1}}), {ok, 1}),
    expect:equal(flatten({ok, {error, 1}}), {error, 1}),
    expect:equal(flatten({error, 1}), {error, 1}),
    expect:equal(flatten({error, {error, 1}}), {error, {error, 1}}).
-endif.

flat_map(Result, Fun) ->
    case Result of
        {ok, X} ->
            case Fun(X) of
                {ok, Y} ->
                    {ok, Y};

                {error, Y1} ->
                    {error, Y1}
            end;

        {error, _} ->
            Result
    end.

-ifdef(TEST).
flat_map_test() ->
    expect:equal(flat_map({error, 1}, fun(X) -> {ok, X + 1} end), {error, 1}),
    expect:equal(flat_map({ok, 1}, fun(X) -> {ok, X + 1} end), {ok, 2}),
    expect:equal(flat_map({ok, 1}, fun(_) -> {error, 1} end), {error, 1}).
-endif.

unwrap(Result, Default) ->
    case Result of
        {ok, V} ->
            V;

        {error, _} ->
            Default
    end.

-ifdef(TEST).
unwrap_test() ->
    expect:equal(unwrap({ok, 1}, 50), 1),
    expect:equal(unwrap({error, <<"nope">>}, 50), 50).
-endif.