R/serialize.R

lsv_serialize <- function(obj, addrs = c()) {
  children <- lobstr::prim_children(obj)
  
  # read the name argument if we can
  name <- "<Anonymous>"
  if (is.name(substitute(obj))) {
    name <- deparse(substitute(obj))
  }
    
  list(
     name = name,
     size = lobstr::prim_size(obj),
     desc = lobstr::prim_desc(obj),
     type = lobstr::prim_type(obj),
     children = lapply(seq_along(children), function(idx) {
       # skip if address already on stack
       addr <- lobstr::prim_address(children[[idx]])
       if (addr %in% addrs) {
         # TODO: draw/link to reference
         return(NULL)
       }
       
       # extract name
       name <- names(children)[[idx]]
       
       # stop chasing enclosures after the global environment
       if (identical(obj, globalenv())) {
         return(list(
           size = 0, 
           name = name,
           type = environment,
           desc = "(Global Environment)",
           children = list()))
       }
       list (name   = name,
             object = lsv_serialize(children[[idx]], c(addrs, addr)))
     })
  )
}
jmcphers/lobstrview documentation built on May 19, 2019, 1:52 p.m.