erlydtl_runtime.erl 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. -module(erlydtl_runtime).
  2. -compile(export_all).
  3. find_value(Key, L) when is_list(L) ->
  4. proplists:get_value(Key, L);
  5. find_value(Key, {GBSize, GBData}) when is_integer(GBSize) ->
  6. case gb_trees:lookup(Key, {GBSize, GBData}) of
  7. {value, Val} ->
  8. Val;
  9. _ ->
  10. undefined
  11. end;
  12. find_value(Key, Tuple) when is_tuple(Tuple) ->
  13. Module = element(1, Tuple),
  14. case Module of
  15. dict ->
  16. case dict:find(Key, Tuple) of
  17. {ok, Val} ->
  18. Val;
  19. _ ->
  20. undefined
  21. end;
  22. Module ->
  23. case proplists:get_value(Key, Module:module_info(exports)) of
  24. 1 ->
  25. Tuple:Key();
  26. _ ->
  27. undefined
  28. end
  29. end.
  30. fetch_value(Key, Data) ->
  31. case find_value(Key, Data) of
  32. undefined ->
  33. throw({undefined_variable, Key});
  34. Val ->
  35. Val
  36. end.
  37. are_equal([Arg1], Arg2) when is_list(Arg1) ->
  38. are_equal(Arg1, Arg2);
  39. are_equal(Arg1, [Arg2]) when is_list(Arg1) ->
  40. are_equal(Arg1, Arg2);
  41. are_equal(Arg1, Arg2) when is_binary(Arg1) ->
  42. are_equal(binary_to_list(Arg1), Arg2);
  43. are_equal(Arg1, Arg2) when is_binary(Arg2) ->
  44. are_equal(Arg1, binary_to_list(Arg2));
  45. are_equal(Arg1, Arg2) ->
  46. Arg1 =:= Arg2.
  47. is_false("") ->
  48. true;
  49. is_false(false) ->
  50. true;
  51. is_false(undefined) ->
  52. true;
  53. is_false("0") ->
  54. true;
  55. is_false(<<"0">>) ->
  56. true;
  57. is_false(<<>>) ->
  58. true;
  59. is_false(_) ->
  60. false.
  61. init_counter_stats(List) ->
  62. init_counter_stats(List, undefined).
  63. init_counter_stats(List, Parent) ->
  64. [{counter, 1},
  65. {counter0, 0},
  66. {revcounter, length(List)},
  67. {revcounter0, length(List) - 1},
  68. {first, true},
  69. {last, length(List) =:= 1},
  70. {parentloop, Parent}].
  71. increment_counter_stats([{counter, Counter}, {counter0, Counter0}, {revcounter, RevCounter},
  72. {revcounter0, RevCounter0}, {first, _}, {last, _}, {parentloop, Parent}]) ->
  73. [{counter, Counter + 1},
  74. {counter0, Counter0 + 1},
  75. {revcounter, RevCounter - 1},
  76. {revcounter0, RevCounter0 - 1},
  77. {first, false}, {last, RevCounter0 =:= 1},
  78. {parentloop, Parent}].
  79. cycle(NamesTuple, Counters) when is_tuple(NamesTuple) ->
  80. element(fetch_value(counter0, Counters) rem size(NamesTuple) + 1, NamesTuple).