/src/erlv8_array.erl

http://github.com/beamjs/erlv8 · Erlang · 52 lines · 38 code · 14 blank · 0 comment · 0 complexity · a478cc5fc0061e96818b3a8fc1273f60 MD5 · raw file

  1. -module(erlv8_array).
  2. -include("erlv8.hrl").
  3. -extends(erlv8_object).
  4. -compile({no_auto_import,[length/1]}).
  5. -export([list/1, object/1, length/1, push/2, unpush/1, unshift/2, delete/2,
  6. new/1, new/2]).
  7. list(#erlv8_array{resource = Resource, vm = VM}) ->
  8. erlv8_vm:enqueue_tick(VM,{list,Resource}).
  9. object(#erlv8_array{resource = Resource, vm = VM}) ->
  10. erlv8_object:new(Resource,VM).
  11. new(O) ->
  12. new(O, undefined).
  13. new(O,V) ->
  14. #erlv8_array{resource = O, vm = V}.
  15. length(Self) ->
  16. erlang:length(list(Self)). %% TODO: I guess it will be more efficient if we had a NIF for that?
  17. push(Val, Self) ->
  18. M = Self:object(),
  19. M:set_value(length(Self),Val).
  20. unpush(Self) ->
  21. M = Self:object(),
  22. M:delete(M:length()-1).
  23. unshift(Val, Self) ->
  24. M = Self:object(),
  25. L = length(Self),
  26. lists:foreach(fun (I) ->
  27. M:set_value(L-I,M:get_value(L-I-1))
  28. end, lists:seq(0,L-1)),
  29. M:set_value(0,Val).
  30. delete(Index, Self) ->
  31. M = Self:object(),
  32. L = length(Self),
  33. V = M:get_value(Index),
  34. lists:foreach(fun (I) ->
  35. M:set_value(I,M:get_value(I+1))
  36. end, lists:seq(Index,L-1)),
  37. M:set_value(length,L-1),
  38. V.