(: Store for XQuery document data , type, text,uri
 on save parse is created and stored
 implementation: data is stored in webSocket
@author Andy Bunce
:)
module namespace docs="lsp/docs";
import module namespace p="xq4" at "xq4.xqm";

(: document info :)
declare type docs:property as enum("textDocument","parse");

(: get $property for $file from session $socket :)
declare function docs:get(
    $socket as xs:string,
    $file as xs:string,
    $property as docs:property
)
{
    let $key:=ws:get($socket,"files")($file)($property)
    return ws:get($socket,$key)
};

(: save $textDocument data as session $socket properties :)
declare function docs:save(
    $socket as xs:string,
    $textDocument as map(*)
)
{
let $text as xs:string:=$textDocument?text
let $uri:=$textDocument?uri
let $files:=ws:get($socket,"files",{})
let $files:=if(map:contains($files,$uri)) 
            then $files 
            else map:put($files,$uri,{
                "textDocument":random:uuid(),
                "parse":random:uuid() })
let $keys:=$files($uri)
let $xml:=p:parse-Module($text)

return (
    ws:set($socket,"files",$files),
    ws:set($socket,$keys?textDocument,$textDocument),
    ws:set($socket,$keys?parse,$xml)
) 
};