Skip to content

Instantly share code, notes, and snippets.

@fuCtor
Last active May 25, 2016 14:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fuCtor/f58feec605b7a5805c062db237cbcbc2 to your computer and use it in GitHub Desktop.
Save fuCtor/f58feec605b7a5805c062db237cbcbc2 to your computer and use it in GitHub Desktop.
JSON multi object stream parsing with Elixir
defmodule Chunk do
def parse(text) do
case :jsx.decoder(Chunk, [], [:return_tail]).(text) do
{:with_tail, item, ""} -> {item, nil}
{:with_tail, item, tail} -> {item, fn() -> parse(tail) end }
other -> other
end
end
def init(_) do
fn(v) -> v end
end
def handle_event(:end_json, state),
do: state
def handle_event(:start_object, state),
do: {%{}, state }
def handle_event(:start_array, state),
do: {[], state }
# end_object end_array
def handle_event(event, {object, merge_func}) when is_function(merge_func) and is_atom(event),
do: merge_func.(object)
def handle_event({:key, key}, {object, merge_func}) when is_map(object),
do: fn(value) -> {Map.put(object, key, value), merge_func} end
def handle_event({_, value}, merge_func) when is_function(merge_func),
do: merge_func.(value)
def handle_event(:end_object, {object, {array, merge_func}}),
do: {array ++ [object], merge_func}
def handle_event({_, value}, {array, merge_func}) when is_list(array),
do: { array ++ [value], merge_func }
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment