-module(bpe_env). -author('Maxim Sokhatsky'). -include_lib("bpe/include/bpe.hrl"). -export([append/3, find/2, find/3, remove/3]). append(kvs, Feed, Rec) -> kvs:append(Rec, Feed); append(env, P, []) -> P; append(env, P, [Rec | Tail]) -> append(env, append(env, P, Rec), Tail); append(env, #process{id = _Proc, docs = _Docs} = P, Rec) when is_tuple(Rec) -> Feed = "/bpe/proc", S = case find(env, P, Rec) of {[], Rest} -> P#process{docs = [Rec | Rest]}; {Found, Rest} -> P#process{docs = [Rec | Found] ++ Rest} end, kvs:append(S, Feed), X = S#process{modified = #ts{time = calendar:local_time()}}, kvs:put(X), X. find(Rec, Feed) -> lists:partition(fun (R) -> lists:foldl(fun ({P, X}, A) -> A andalso element(P, R) == X end, true, [{X, Y} || {X, Y} <- lists:zip(lists:seq(1, size(Rec)), tuple_to_list(Rec)), Y /= []]) end, Feed). find(kvs, Feed, Rec) -> find(Rec, kvs:all(Feed)); find(env, Proc, Rec) -> find(Rec, Proc#process.docs). remove(env, P, []) -> P; remove(env, P, [Rec | Tail]) -> remove(env, remove(env, P, Rec), Tail); remove(kvs, Feed, Rec) when is_tuple(Rec) -> {X, _Y} = find(kvs, Feed, Rec), lists:map(fun (I) -> kvs:delete(Feed, element(2, I)) end, X); remove(env, Proc, Rec) when is_tuple(Rec) -> {_X, Y} = find(env, Proc, Rec), S = Proc#process{docs = Y, modified = #ts{time = calendar:local_time()}}, kvs:append(S, "/bpe/proc"), kvs:put(S), S.