| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2018-12-12 21:06:12 +0100 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2018-12-12 21:06:12 +0100 | 
| commit | c7900a01ff8028be4ae1b73cd4c1fe3dfef13200 (patch) | |
| tree | bfcace674c9cdb611ec7fcfdcbb50b03fc385e72 /src/ataxic.erl | |
| parent | d05a5094ba9e3fd7c5b2e86900742b626b674828 (diff) | |
...
Diffstat (limited to 'src/ataxic.erl')
| -rw-r--r-- | src/ataxic.erl | 116 | 
1 files changed, 77 insertions, 39 deletions
| diff --git a/src/ataxic.erl b/src/ataxic.erl index a1a2a1a..8f8465f 100644 --- a/src/ataxic.erl +++ b/src/ataxic.erl @@ -67,11 +67,50 @@     ]  ). --export([apply_to/2]). +-export([apply_to/2, matches/2]).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec basic_apply_to (basic(), any()) -> any(). +basic_apply_to (#field{ ix = IX, op = OP}, Val) -> +   setelement(IX, Val, basic_apply_to(OP, element(IX, Val))); +basic_apply_to (#array_cell{ ix = IX, op = OP }, Val) -> +   array:set(IX, basic_apply_to(OP, array:get(IX, Val)), Val); + +basic_apply_to (#seq{ ops = List }, Val) -> +   lists:foldl(fun basic_apply_to/2, Val, List); + +basic_apply_to (#list_append { values = List, head = Head }, Val) -> +   case Head of +      true -> (List ++ Val); +      _ -> (Val ++ List) +   end; + +basic_apply_to (#const{ value = Val }, _Val) -> +   Val; +basic_apply_to (#current{}, Val) -> +   Val; + +basic_apply_to (#ge{ p0 = P0, p1 = P1 }, _Val) -> +   P0 >= P1; +basic_apply_to (#gt{ p0 = P0, p1 = P1 }, _Val) -> +   P0 > P1; +basic_apply_to (#le{ p0 = P0, p1 = P1 }, _Val) -> +   P0 =< P1; +basic_apply_to (#lt{ p0 = P0, p1 = P1 }, _Val) -> +   P0 < P1; +basic_apply_to (#eq{ p0 = P0, p1 = P1 }, _Val) -> +   P0 == P1; + +basic_apply_to (#land{ params = List }, _Val) -> +   lists:all(fun (E) -> E end, List); + +basic_apply_to (#lor{ params = List }, _Val) -> +   lists:any(fun (E) -> E end, List); + +basic_apply_to (#neg{ param = V }, _Val) -> +   not V.  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -120,42 +159,41 @@ neg (V) -> #neg{ param = V }.  %%%%% APPLY TO %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec apply_to (basic(), any()) -> any(). -apply_to (#field{ ix = IX, op = OP}, Val) -> -   setelement(IX, Val, apply_to(OP, element(IX, Val))); -apply_to (#array_cell{ ix = IX, op = OP }, Val) -> -   array:set(IX, apply_to(OP, array:get(IX, Val)), Val); - -apply_to (#seq{ ops = List }, Val) -> -   lists:foldl(fun apply_to/2, Val, List); - -apply_to (#list_append { values = List, head = Head }, Val) -> -   case Head of -      true -> (List ++ Val); -      _ -> (Val ++ List) +-spec apply_to (meta(), ataxia_entry:type()) -> ataxia_entry:type(). +apply_to (#read_perm{ op = OP }, Entry) -> +   ataxia_entry:set_read_permission +   ( +      basic_apply_to(OP, ataxia_entry:get_read_permission(Entry)), +      Entry +   ); +apply_to (#write_perm{ op = OP }, Entry) -> +   ataxia_entry:set_write_permission +   ( +      basic_apply_to(OP, ataxia_entry:get_write_permission(Entry)), +      Entry +   ); +apply_to (#value{ op = OP }, Entry) -> +   ataxia_entry:set_value +   ( +      basic_apply_to(OP, ataxia_entry:get_value(Entry)), +      Entry +   ); +apply_to (#mseq { ops = List }, Entry) -> +   lists:foldl(fun apply_to/2, Entry, List). + +-spec matches (meta(), ataxia_entry:type()) -> boolean(). +matches (#read_perm{ op = OP }, Entry) -> +   case basic_apply_to(OP, ataxia_entry:get_read_permission(Entry)) of +      true -> true; +      _ -> false     end; - -apply_to (#const{ value = Val }, _Val) -> -   Val; -apply_to (#current{}, Val) -> -   Val; - -apply_to (#ge{ p0 = P0, p1 = P1 }, _Val) -> -   P0 >= P1; -apply_to (#gt{ p0 = P0, p1 = P1 }, _Val) -> -   P0 > P1; -apply_to (#le{ p0 = P0, p1 = P1 }, _Val) -> -   P0 =< P1; -apply_to (#lt{ p0 = P0, p1 = P1 }, _Val) -> -   P0 < P1; -apply_to (#eq{ p0 = P0, p1 = P1 }, _Val) -> -   P0 == P1; - -apply_to (#land{ params = List }, _Val) -> -   lists:all(fun (E) -> E end, List); - -apply_to (#lor{ params = List }, _Val) -> -   lists:any(fun (E) -> E end, List); - -apply_to (#neg{ param = V }, _Val) -> -   not V. +matches (#write_perm{ op = OP }, Entry) -> +   case basic_apply_to(OP, ataxia_entry:get_write_permission(Entry)) of +      true -> true; +      _ -> false +   end; +matches (#value{ op = OP }, Entry) -> +   case basic_apply_to(OP, ataxia_entry:get_value(Entry)) of +      true -> true; +      _ -> false +   end. | 


