(var source-node (get (require "source-map") 'Source-node))

(def source-map (node)
     (if
      (node? node 'output)
       (new source-node
            node.source.line
            node.source.col
            node.source.file
            (if (list? node.contents)
                         (map node.contents source-map)
                         (source-map node.contents)))

       (or (string? node) (number? node)) (node.to-string)))

(def sourcemapper (untranspiled-node)
     (|> untranspiled-node transpile *sourcemapper))

(def *sourcemapper (transpiled-node)
     (var source-nodes (source-map transpiled-node)
          map (pipe source-nodes .to-string-with-source-map (get 'map)))

     (each key (keys sibilant.source-cache)
           (map.set-source-content key (get sibilant.source-cache key)))

     map)
