From 7a457e520512111d5b412842d75a7111fd392576 Mon Sep 17 00:00:00 2001 From: rhpidfyre Date: Sat, 8 Mar 2025 16:12:02 -0500 Subject: [PATCH] rewrite of types and names --- src/rt/rfwfs/index.ts | 15 +--- src/rt/rfwfs/main.ts | 174 +++++++++++++++++++++--------------------- 2 files changed, 92 insertions(+), 97 deletions(-) diff --git a/src/rt/rfwfs/index.ts b/src/rt/rfwfs/index.ts index ada000d..549bc11 100644 --- a/src/rt/rfwfs/index.ts +++ b/src/rt/rfwfs/index.ts @@ -1,14 +1,7 @@ -import { type Entry } from "./main" +import { type Entry } from "./types/entry" +import { wrap_bsearch, type WrapBSearch } from "./wrap" -interface Wrap { - readonly result: T, - readonly index: number -} -function wrap_result(result: T, index: number): Wrap { - return { result: result, index: index } -} - -export default function entry_search(entry_collection: T[], file_name: string): Wrap | undefined { +export default function directory_search(entry_collection: T[], file_name: string): WrapBSearch | undefined { let start = 0 let end = entry_collection.length-1 while (start<=end) { @@ -16,7 +9,7 @@ export default function entry_search(entry_collection: T[], fil const median_name = entry_collection[median].name if (median_name === file_name) { - return wrap_result(entry_collection[median], median) + return wrap_bsearch(median, entry_collection[median]) } else if (median_name extends Entry { - readonly collection: T[], -} -interface EntryFile extends Entry { - inner: T -} -interface EntryCollection extends EntryCollectionInner { - pop: (file_name: string) => T | undefined, - find: (file_name: string) => T | undefined - push: (entry: Entry) => PushStatus, - sort: () => void, -} interface Rfwfs { - is_dir: (entry: T) => boolean, + directory: (name: string, permissions: Permissions, timestamp: number, inner_default: T[]) => EntryCollection, is_file: (entry: T) => boolean, - entry: (name: string, permissions: Permissions, timestamp: number, inner: T) => EntryFile, - collection: (inner: T[]) => EntryCollection, + is_dir: (entry: T) => boolean, + file: (name: string, permissions: Permissions, timestamp: number, inner_default: FileInner) => EntryFile, } -function readable(self: EntryCollection): boolean { - return self.permissions === Permissions.rw || self.permissions === Permissions.r +function read_write_access(permissions: Permissions): boolean { + return permissions === Permissions.rw +} +function read_access(permissions: Permissions): boolean { + return read_write_access(permissions) || permissions === Permissions.r +} +function write_access(permissions: Permissions): boolean { + return read_write_access(permissions) || permissions === Permissions.w } -function writable(self: EntryCollection): boolean { - return self.permissions === Permissions.rw || self.permissions === Permissions.w +function directory_sort(self: EntryCollectionManipulate) { + self.__body.sort((a,z) => a.name.localeCompare(z.name)) } -function sort(self: EntryCollection) { - self.collection.sort((a,z) => a.name.localeCompare(z.name)) -} - -function push(self: EntryCollection, entry: Entry): PushStatus { - if (writable(self)) { - const no_duplicates = entry_search(self.collection, entry.name) +function directory_push(self: EntryCollection, entry: E): WrapResultNone { + if (write_access(self.permissions)) { + const no_duplicates = directory_search(self.inner.__body, entry.name) if (!no_duplicates) { - self.push(entry) - self.sort() - return PushStatus.Ok + self.inner.__body.push(entry) + self.inner.__body.sort() + return wrap_none(PushStatus.Ok) } - return PushStatus.Duplicate + return wrap_none(PushStatus.Duplicate) } - return PushStatus.Denied + return wrap_none(PushStatus.Denied) } -function find(self: EntryCollection, file_name: string) { - const file_search = entry_search(self.collection, file_name) - return file_search ? file_search.result : undefined +function directory_find(self: EntryCollection, file_name: string): WrapResultEntry { + if (read_access(self.permissions)) { + const file_search = directory_search(self.inner.__body, file_name) + if (file_search) { + return wrap_entry(ReadStatus.Ok, file_search.result) + } + return wrap_entry(ReadStatus.NotFound) + } + return wrap_entry(ReadStatus.Denied) } -function pop(self: EntryCollection, file_name: string) { - const file_search = entry_search(self.collection, file_name) - if (file_search) { - self.collection.splice(file_search.index, 1) - return file_search.result +function directory_pop(self: EntryCollection, file_name: string): WrapResultEntry { + if (read_write_access(self.permissions)) { + const pop_find = directory_search(self.inner.__body, file_name) + if (pop_find) { + self.inner.__body.splice(pop_find.some, 1) + return wrap_entry(ReadStatus.Ok, pop_find.result) + } + return wrap_entry(ReadStatus.NotFound) } - return undefined + return wrap_entry(ReadStatus.Denied) +} + +function file_inner_read(self: EntryFileInner, permissions: Permissions): FileInner | undefined { + return read_access(permissions) ? self.__body : undefined +} + +function file_inner_write(self: EntryFileInner, permissions: Permissions, item: FileInner): boolean { + if (write_access(permissions)) { + self.__body = item + return true + } + return false +} + +function file_inner(permissions: Permissions, inner_default: FileInner): EntryFileInner { + const file_inner_trait = { __body: inner_default } as EntryFileInner + file_inner_trait.read = function() { return file_inner_read(this, permissions) } + file_inner_trait.write = function(item) { return file_inner_write(this, permissions, item) } + return file_inner_trait +} + +function dir_inner(self: EntryCollection, collection: T[]): EntryCollectionManipulate { + const collection_trait = { __body: collection } as EntryCollectionManipulate + collection_trait.pop = function(file_name) { return directory_pop(self, file_name) } + collection_trait.find = function(file_name) { return directory_find(self, file_name) } + collection_trait.push = function(entry) { return directory_push(self, entry) } + collection_trait.sort = function() { return directory_sort(this) } + collection_trait.sort() //the default collection is automatically sorted on directory creation. + return collection_trait } const rfwfs = {} as Rfwfs @@ -85,35 +95,27 @@ const rfwfs = {} as Rfwfs rfwfs.is_dir = function(entry) { return entry.type === EntryType.Directory } - rfwfs.is_file = function(entry) { return entry.type === EntryType.File } -rfwfs.entry = function(name, permissions, timestamp, inner) { - return { - name: name, - type: typeof inner === "object" ? EntryType.Directory : EntryType.File, - inner: inner, - timestamp: timestamp ? timestamp : (Date.now()/1000)|0, - permissions: permissions, - } +rfwfs.file = function(name, permissions, timestamp, inner_default) { + const file = { type: EntryType.File } as EntryFile + file.permissions = permissions + file.timestamp = timestamp + file.inner = file_inner(permissions, inner_default) + file.name = name + file.hash = "0" + return file } -rfwfs.collection = function(collection: T[]): EntryCollection { - const collection_trait = { collection: collection } as EntryCollection - collection_trait.pop = function(file_name) { return pop(this, file_name) } - collection_trait.find = function(file_name) { return find(this, file_name) } - collection_trait.push = function(entry) { return push(this, entry) } - collection_trait.sort = function() { return sort(this) } - collection_trait.sort() - return collection_trait +rfwfs.directory = function(name: string, permissions: Permissions, timestamp: number, inner_default: T[]): EntryCollection { + const directory = { type: EntryType.Directory } as EntryCollection + directory.permissions = permissions + directory.timestamp = timestamp + directory.inner = dir_inner(directory, inner_default) + directory.name = name + return directory } -export default rfwfs -export { - EntryType, - Permissions, - type EntryCollection, - type Entry, -} \ No newline at end of file +export default rfwfs \ No newline at end of file