diff options
Diffstat (limited to 'src/lqueue.erl')
| -rw-r--r-- | src/lqueue.erl | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/lqueue.erl b/src/lqueue.erl new file mode 100644 index 0000000000..8bbd52d9fc --- /dev/null +++ b/src/lqueue.erl @@ -0,0 +1,45 @@ +-module(lqueue). + +-compile([export_all]). + +-define(QUEUE, queue). + +new() -> {0, ?QUEUE:new()}. + +is_empty({0, _Q}) -> + true; +is_empty(_) -> + false. + +in(V, {L, Q}) -> {L+1, ?QUEUE:in(V, Q)}. +in_r(V, {L, Q}) -> {L+1, ?QUEUE:in_r(V, Q)}. + +out({0, _Q} = Q) -> + {empty, Q}; +out({L, Q}) -> + {Result, Q1} = ?QUEUE:out(Q), + {Result, {L-1, Q1}}. + +out_r({0, _Q} = Q) -> + {empty, Q}; +out_r({L, Q}) -> + {Result, Q1} = ?QUEUE:out_r(Q), + {Result, {L-1, Q1}}. + +join({L1, Q1}, {L2, Q2}) -> + {L1 + L2, ?QUEUE:join(Q1, Q2)}. + +to_list({_L, Q}) -> + ?QUEUE:to_list(Q). + +from_list(L) -> + {length(L), ?QUEUE:from_list(L)}. + +queue_fold(Fun, Init, Q) -> + case out(Q) of + {empty, _Q} -> Init; + {{value, V}, Q1} -> queue_fold(Fun, Fun(V, Init), Q1) + end. + +len({L, _Q}) -> + L. |
