diff --git a/src/rt/rfwfs/collection.ts b/src/rt/rfwfs/collection.ts index a6a97b7..1f986ea 100644 --- a/src/rt/rfwfs/collection.ts +++ b/src/rt/rfwfs/collection.ts @@ -14,33 +14,45 @@ interface EntryCollection extends EntryCollectionManipulate { readonly inner: Files } -function entry_trait>() { - const trait = {} as EntryCollection - trait.sort = function() { - this.inner.sort((a,z) => a.name.localeCompare(z.name)) +function sort>(self: EntryCollection) { + self.inner.sort((a,z) => a.name.localeCompare(z.name)) +} + +function push, T extends Entry>(self: EntryCollection, entry: Entry) { + const no_duplicates = entry_search(self.inner, entry.name) + if (!no_duplicates) { + self.push(entry) + self.sort() + return true } - trait.push = function(entry) { - const no_duplicates = entry_search(this.inner, entry.name) - if (!no_duplicates) { - this.push(entry) - this.sort() - return true - } - return false + return false +} + +function get>(self: EntryCollection, file_name: string) { + const file_search = entry_search(self.inner, file_name) + return file_search ? file_search.result : undefined +} + +function pop>(self: EntryCollection, file_name: string) { + const file_search = entry_search(self.inner, file_name) + if (file_search) { + self.inner.splice(file_search.index, 1) + return file_search.result } - trait.pop = function(file_name) { - const file_search = entry_search(this.inner, file_name) - if (file_search) { - this.inner.splice(file_search.index, 1) - return file_search.result - } - return - } - return trait + return undefined +} + +function entry_collection>(inner: Files): EntryCollection { + const collection = { inner: inner } as EntryCollection + collection.sort = function() { return sort(this) } + collection.push = function(entry) { return push(this, entry) } + collection.get = function(file_name) { return get(this, file_name) } + collection.pop = function(file_name) { return pop(this, file_name) } + return collection } export { - entry_trait, + entry_collection, type EntryCollection, type Files, } \ No newline at end of file diff --git a/src/rt/rfwfs/index.ts b/src/rt/rfwfs/index.ts index 7727ec1..8a1b289 100644 --- a/src/rt/rfwfs/index.ts +++ b/src/rt/rfwfs/index.ts @@ -1,15 +1,15 @@ import { type Entry } from "./main" import { type Files } from "./collection" -interface SearchResult { +interface Wrap> { readonly result: T, readonly index: number } -function wrap_result(result: T, index: number): SearchResult { +function wrap_result>(result: T, index: number): Wrap { return { result: result, index: index } } -export default function entry_search(cloned_file_collection: Files, file_name: string): SearchResult> | undefined { +export default function entry_search>(cloned_file_collection: Files, file_name: string): Wrap> | undefined { let start = 0 let end = cloned_file_collection.length-1 while (start<=end) { @@ -25,4 +25,4 @@ export default function entry_search(cloned_file_collection: Files, file_n } } return undefined -} +} \ No newline at end of file