-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathutilities.js
114 lines (105 loc) · 4.22 KB
/
utilities.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
const path = require('path')
const fileSystem = require('fs')
const fs = require('fs').promises
const recorder = require('transcript/recorder').create(() => '0')
const { coalesce } = require('extant')
const FileSystem = require('./filesystem')
function recordify (header, parts) {
return recorder([[ Buffer.from(JSON.stringify(header)) ].concat(parts)])
}
const appendable = require('./appendable')
exports.directory = path.resolve(__dirname, './test/tmp')
exports.reset = async function (directory) {
await coalesce(fs.rm, fs.rmdir).call(fs, directory, { force: true, recursive: true })
await fs.mkdir(directory, { recursive: true })
}
exports.vivify = async function (directory) {
const reader = new FileSystem.Reader(directory, { extractor: parts => [ parts[0] ] })
const vivified = {}
async function vivify (id) {
const { page } = await reader.page(id)
if (page.leaf) {
const items = vivified[id] = page.items.map((item, index) => [ 'insert', index, item.parts[0] ])
if (page.right) {
items.push([ 'right', page.right ])
}
} else {
const items = vivified[id] = page.items.map(item => [ item.id, item.key == null ? null : item.key ])
for (const item of items) {
await vivify(item[0])
}
}
}
await vivify('0.0')
return vivified
}
exports.serialize = async function (directory, files) {
let instance = 0
for (const id in files) {
instance = Math.max(+id.split('.')[0], instance)
await fs.mkdir(path.resolve(directory, 'pages', id), { recursive: true })
if (+id.split('.')[1] % 2 == 0) {
const buffers = files[id].map((record, index) => {
return recordify({
method: 'insert',
index: index,
id: record[0]
}, record[1] != null ? [ Buffer.from(JSON.stringify(record[1])) ] : [])
})
buffers.push(recordify({ method: 'length', length: files[id].length }, []))
const buffer = Buffer.concat(buffers)
const file = path.resolve(directory, 'pages', id, 'page')
await fs.writeFile(file, buffer)
} else {
let key = null
const writes = files[id].map((record, index) => {
switch (record[0]) {
case 'right':
return {
header: { method: 'right' },
parts: [ Buffer.from(JSON.stringify(record[1])) ]
}
case 'insert':
if (record[1] == 0 && id != '0.1') {
key = [ Buffer.from(JSON.stringify([ record[2] ])) ]
}
return {
header: { method: 'insert', index: record[1] },
parts: [ Buffer.from(JSON.stringify(record[2])) ]
}
case 'delete':
return {
header: { method: 'delete', index: record[1] },
parts: []
}
default:
console.log('?', record)
break
}
}).map(entry => recordify(entry.header, entry.parts))
if (key != null) {
writes.push(recordify({ method: 'key' }, key))
}
const file = path.resolve(directory, 'pages', id, '0.0')
await fs.writeFile(file, Buffer.concat(writes))
}
}
await fs.mkdir(path.resolve(directory, 'instances', String(instance)), { recursive: true })
await fs.mkdir(path.resolve(directory, 'balance'))
}
exports.alphabet = function (length, letters = 26) {
const alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('').slice(0, letters)
function append (length) {
if (length == 1) {
return alphabet.map(letter => [ letter ])
}
const entries = []
for (const letter of alphabet) {
for (const appendage of append(length - 1)) {
entries.push(([ letter ]).concat(appendage))
}
}
return entries
}
return append(length).map(word => word.join(''))
}