| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/ataxic.erl')
| -rw-r--r-- | src/ataxic.erl | 159 | 
1 files changed, 2 insertions, 157 deletions
| diff --git a/src/ataxic.erl b/src/ataxic.erl index 4d829f3..4e011c6 100644 --- a/src/ataxic.erl +++ b/src/ataxic.erl @@ -3,53 +3,9 @@  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-include("ataxia/ataxic.hrl").  %%%% BASIC OP %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% Select --record(field, {ix :: non_neg_integer(), op :: basic()}). --record(upfield, {ix :: non_neg_integer(), op :: basic()}). - -%%%% Sequence of instructions --record(seq, {ops :: list(basic())}). - -%%%% Values Access --record(const, {value :: any()}). --record(current, {}). - -% Possible improvement: add support for some sort of registers. -% This would add a dict (no need for orddict here) when evaluating Ataxic -% expressions, with the following functions: -% -record(reg_store, {name :: binary(), op :: basic()}). -% -record(reg_load, {name :: binary()}). -% It's kind of weird to use though, cause you can't retrieve what you've stored -% at a node that was deeper in the query's tree. It can be used to move values -% further down (or horizontally) though, and there are already instructions that -% give you values found further down. - --record -( -   apply_fun, -   { -      module :: atom(), -      function :: atom(), -      params :: list(basic()) -   } -). - -%%%% Number Comparison --record(gt, {p0 :: basic(), p1 :: basic()}). --record(ge, {p0 :: basic(), p1 :: basic()}). --record(lt, {p0 :: basic(), p1 :: basic()}). --record(le, {p0 :: basic(), p1 :: basic()}). --record(eq, {p0 :: basic(), p1 :: basic()}). - -%%%% Bool Operations --record(land, {params :: list(basic())}). --record(lor, {params :: list(basic())}). --record(neg, {param :: basic()}). - --record(list_cons, {param :: basic()}). -  -type basic() ::     #field{}     | #upfield{} @@ -78,14 +34,6 @@     | #list_cons{}.  %%%% META OP %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% Select --record(read_perm, {op :: basic()}). --record(write_perm, {op :: basic()}). --record(lock, {op :: basic()}). --record(value, {op :: basic()}). - --record(mseq, {ops :: list(meta())}). -  -type meta() :: #read_perm{} | #write_perm{} | #value{} | #lock{} | #mseq{}.  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -126,7 +74,7 @@  -export([apply_to/2, matches/2]). --export([optimize/1, is_constant/1]). +-export([is_constant/1]).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -173,102 +121,6 @@ basic_apply_to (#neg{ param = V }, Val) ->  basic_apply_to (#list_cons{ param = V }, Val) ->     [basic_apply_to(V, Val)|Val]. --spec optimize_update_field_sequence (list(basic()), list(basic())) -> basic(). -optimize_update_field_sequence ([], Result) -> -   case Result of -      [A] -> A; -      _ -> sequence(Result) -   end; -optimize_update_field_sequence (UnsortedOPs, CurrentResults) -> -   {FieldUpdates, PotentiallyImportantOPs} = -      lists:splitwith(fun (E) -> is_record(E, upfield) end, UnsortedOPs), - -   SortedFieldUpdates = -      lists:sort -      ( -         fun (A, B) -> -            ((A#upfield.ix) =< (B#upfield.ix)) -         end, -         FieldUpdates -      ), - -   {LastIX, LastUpdateOPs, OtherMergedFieldUpdates} = -      lists:foldl -      ( -         fun (Update, {CurrentIX, CurrentOPs, CurrentResult}) -> -            case (Update#upfield.ix == CurrentIX) of -               true -> -                  {CurrentIX, [Update#upfield.op|CurrentOPs], CurrentResult}; - -               _ -> -                  { -                     Update#upfield.ix, -                     [Update#upfield.op], -                     ( -                        case CurrentOPs of -                           [] -> CurrentResult; -                           [OP] -> -                              [ -                                 update_field(CurrentIX, OP) -                                 |CurrentResult -                              ]; -                           _ -> -                              [ -                                 update_field(CurrentIX, sequence(CurrentOPs)) -                                 |CurrentResult -                              ] -                        end -                     ) -                  } -            end -         end, -         {-1, [], []}, -         SortedFieldUpdates -      ), - -   MergedFieldUpdates = -      ( -         case LastUpdateOPs of -            [] -> OtherMergedFieldUpdates; -            [OP] -> -               [ -                  update_field(LastIX, OP) -                  |OtherMergedFieldUpdates -               ]; -            _ -> -               [ -                  update_field(LastIX, sequence(LastUpdateOPs)) -                  |OtherMergedFieldUpdates -               ] -         end -      ), -   {ImportantOPs, PotentialFieldUpdates} = -      lists:splitwith -      ( -         fun (E) -> not is_record(E, upfield) end, -         PotentiallyImportantOPs -      ), - -   optimize_update_field_sequence -   ( -      PotentialFieldUpdates, -      (CurrentResults ++ MergedFieldUpdates ++ ImportantOPs) -   ). - --spec flatten_sequence (list(basic())) -> list(basic()). -flatten_sequence (OPs) -> -   lists:foldl -   ( -      fun (E, CurrentOPs) -> -         case is_record(E, seq) of -            true -> (E#seq.ops ++ CurrentOPs); -            _ -> [E|CurrentOPs] -         end -      end, -      [], -      OPs -   ). -  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -334,13 +186,6 @@ update_write_permission (OP) -> #write_perm{ op = OP }.  -spec update_value (basic()) -> meta().  update_value (OP) -> #value{ op = OP }. --spec optimize (basic()) -> basic(). -optimize (#seq{ ops = OPs }) -> -   S0OPs = flatten_sequence(OPs), -   S1OPs = lists:filter(fun (E) -> (not is_record(E, current)) end, S0OPs), -   optimize_update_field_sequence(S1OPs, []); -optimize (OP) -> OP. -  %%%%% APPLY TO %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  -spec apply_to (meta(), ataxia_entry:type()) -> ataxia_entry:type().  apply_to (#value{ op = OP }, Entry) -> | 


