@@ -0,0 +1,66 @@
1+{-# LANGUAGE
2+ DataKinds ,
3+ DeriveGeneric ,
4+ OverloadedLabels,
5+ OverloadedStrings ,
6+ TypeApplications ,
7+ TypeOperators #-}
8+
9+module Server.API.Completions (
10+ CompletionsAPI,
11+ completionServer
12+ ) where
13+
14+import Servant.Server
15+import Servant
16+import Data.Completions
17+import Server.App
18+import Data.Connection
19+import Data.Query
20+
21+type CompletionsDescription = Description "\
22+ \Gets tag completion tree\n\n\
23+ \```haskell\n\
24+ \data CompletionTree = CompletionTreeNode {\n\
25+ \ value :: Maybe String,\n\
26+ \ subtree :: Map Char CompletionTree\n\
27+ \}\n\
28+ \```\n\n\
29+ \The psuedocode for retrieving all completions from the tree:\n\n\
30+ \```swift\n\
31+ \func getCompletion(tree: CompletionTree, word: String) -> [String] {\n\
32+ \ if word == \"\" {\n\
33+ \ return getValues(tree: tree)\n\
34+ \ }\n\
35+ \\n\
36+ \ let character = word.first\n\
37+ \\n\
38+ \ if tree.subtree[character] == null {\n\
39+ \ return []\n\
40+ \ } else {\n\
41+ \ return getCompletion(tree: tree.subtree[character], word.withoutFirst)\n\
42+ \ }\n\
43+ \}\n\
44+ \\n\
45+ \func getValues(tree: CompletionTree) -> [String] {\n\
46+ \ var out = []\n\
47+ \\n\
48+ \ if tree.value != null {\n\
49+ \ out += tree.value\n\
50+ \ }\n\
51+ \\n\
52+ \ for (key, subtree) in tree {\n\
53+ \ out += getValues(tree: tree)\n\
54+ \ }\n\
55+ \\n\
56+ \ return out\n\
57+ \}\n\
58+ \```"
59+
60+type CompletionsAPI = "tagCompletions" :> CompletionsDescription :> Get '[JSON] (CompletionTree Char)
61+
62+completionServer :: ServerT CompletionsAPI App
63+completionServer = completionHandler
64+
65+completionHandler :: ServerT CompletionsAPI App
66+completionHandler = runQerror $ mkCompletionTree <$> getTags