From 168a848f101c4b05198006ff25189b6a52651eac Mon Sep 17 00:00:00 2001 From: Keijo Kapp Date: Thu, 9 May 2024 12:43:50 +0300 Subject: [PATCH 1/2] Fix typings of `at` methods --- lib/database.ts | 27 ++++++++++++++++++++------- lib/subspace.ts | 26 +++++++++++++++++++++----- 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/lib/database.ts b/lib/database.ts index 41afec6..214de05 100644 --- a/lib/database.ts +++ b/lib/database.ts @@ -43,15 +43,28 @@ export default class Database(hasSubspace: GetSubspace): Database - /** Create a shallow reference to the database at the subspace of another database reference */ - // at(prefix: KeyIn | null, keyXf?: Transformer, valueXf?: Transformer): Database - - at(prefix: KeyIn | null): Database; - at(prefix: KeyIn | null, keyXf: Transformer): Database; + at(prefix: KeyIn | null, keyXf?: undefined, valueXf?: undefined): Database; + at(prefix: KeyIn | null, keyXf: Transformer, valueXf?: undefined): Database; at(prefix: KeyIn | null, keyXf: undefined, valueXf: Transformer): Database; at(prefix: KeyIn | null, keyXf: Transformer, valueXf: Transformer): Database; - - at(prefixOrSubspace: GetSubspace | KeyIn | null, keyXf?: Transformer, valueXf?: Transformer): Database { + at(prefix: KeyIn | null, keyXf?: Transformer, valueXf?: undefined): + | Database + | Database; + at(prefix: KeyIn | null, keyXf: undefined, valueXf?: Transformer): + | Database + | Database; + at(prefix: KeyIn | null, keyXf: Transformer | undefined, valueXf: Transformer): + | Database + | Database; + at(prefix: KeyIn | null, keyXf: Transformer, valueXf?: Transformer): + | Database + | Database; + at(prefix: KeyIn | null, keyXf?: Transformer, valueXf?: Transformer): + | Database + | Database + | Database + | Database; + at(prefixOrSubspace: GetSubspace | KeyIn | null, keyXf?: Transformer, valueXf?: Transformer) { if (isGetSubspace(prefixOrSubspace)) return new Database(this._db, prefixOrSubspace.getSubspace()) else return new Database(this._db, this.subspace.at(prefixOrSubspace, keyXf, valueXf)) } diff --git a/lib/subspace.ts b/lib/subspace.ts index eb52e0c..9c75507 100644 --- a/lib/subspace.ts +++ b/lib/subspace.ts @@ -41,12 +41,28 @@ export default class Subspace; - at(prefix: KeyIn | null, keyXf: Transformer): Subspace; + at(prefix: KeyIn | null, keyXf?: undefined, valueXf?: undefined): Subspace; + at(prefix: KeyIn | null, keyXf: Transformer, valueXf?: undefined): Subspace; at(prefix: KeyIn | null, keyXf: undefined, valueXf: Transformer): Subspace; - at(prefix: KeyIn | null, keyXf?: Transformer, valueXf?: Transformer): Subspace; - // *** - at(prefix: KeyIn | null, keyXf: Transformer = this.keyXf, valueXf: Transformer = this.valueXf) { + at(prefix: KeyIn | null, keyXf: Transformer, valueXf: Transformer): Subspace; + at(prefix: KeyIn | null, keyXf?: Transformer, valueXf?: undefined): + | Subspace + | Subspace; + at(prefix: KeyIn | null, keyXf: undefined, valueXf?: Transformer): + | Subspace + | Subspace; + at(prefix: KeyIn | null, keyXf: Transformer | undefined, valueXf: Transformer): + | Subspace + | Subspace; + at(prefix: KeyIn | null, keyXf: Transformer, valueXf?: Transformer): + | Subspace + | Subspace; + at(prefix: KeyIn | null, keyXf?: Transformer, valueXf?: Transformer): + | Subspace + | Subspace + | Subspace + | Subspace; + at(prefix: KeyIn | null, keyXf: Transformer = this.keyXf, valueXf: Transformer = this.valueXf) { const _prefix = prefix == null ? null : this.keyXf.pack(prefix) return new Subspace(concatPrefix(this.prefix, _prefix), keyXf, valueXf) } From cd6e04443a36d1129494bff99472c28167d946c5 Mon Sep 17 00:00:00 2001 From: Keijo Kapp Date: Thu, 9 May 2024 12:44:33 +0300 Subject: [PATCH 2/2] Made subspacing methods consistent --- lib/database.ts | 44 ++++++++++++++++++++++++++------------------ lib/subspace.ts | 39 ++++++++++++++++++++++++--------------- 2 files changed, 50 insertions(+), 33 deletions(-) diff --git a/lib/database.ts b/lib/database.ts index 214de05..8289fdd 100644 --- a/lib/database.ts +++ b/lib/database.ts @@ -1,6 +1,6 @@ import * as fdb from './native' import Transaction, { RangeOptions, Watch } from './transaction' -import {Transformer, defaultTransformer} from './transformer' +import {Transformer} from './transformer' import {NativeValue} from './native' import {KeySelector} from './keySelector' import Subspace, { root, GetSubspace, isGetSubspace } from './subspace' @@ -43,40 +43,48 @@ export default class Database(hasSubspace: GetSubspace): Database - at(prefix: KeyIn | null, keyXf?: undefined, valueXf?: undefined): Database; - at(prefix: KeyIn | null, keyXf: Transformer, valueXf?: undefined): Database; - at(prefix: KeyIn | null, keyXf: undefined, valueXf: Transformer): Database; - at(prefix: KeyIn | null, keyXf: Transformer, valueXf: Transformer): Database; - at(prefix: KeyIn | null, keyXf?: Transformer, valueXf?: undefined): + at(prefix?: KeyIn | null, keyXf?: undefined, valueXf?: undefined): Database; + at(prefix: KeyIn | null | undefined, keyXf: Transformer, valueXf?: undefined): Database; + at(prefix: KeyIn | null | undefined, keyXf: undefined, valueXf: Transformer): Database; + at(prefix: KeyIn | null | undefined, keyXf: Transformer, valueXf: Transformer): Database; + at(prefix: KeyIn | null | undefined, keyXf?: Transformer, valueXf?: undefined): | Database | Database; - at(prefix: KeyIn | null, keyXf: undefined, valueXf?: Transformer): + at(prefix: KeyIn | null | undefined, keyXf: undefined, valueXf?: Transformer): | Database | Database; - at(prefix: KeyIn | null, keyXf: Transformer | undefined, valueXf: Transformer): + at(prefix: KeyIn | null | undefined, keyXf: Transformer | undefined, valueXf: Transformer): | Database | Database; - at(prefix: KeyIn | null, keyXf: Transformer, valueXf?: Transformer): + at(prefix: KeyIn | null | undefined, keyXf: Transformer, valueXf?: Transformer): | Database | Database; - at(prefix: KeyIn | null, keyXf?: Transformer, valueXf?: Transformer): + at(prefix?: KeyIn | null, keyXf?: Transformer, valueXf?: Transformer): | Database | Database | Database | Database; - at(prefixOrSubspace: GetSubspace | KeyIn | null, keyXf?: Transformer, valueXf?: Transformer) { + at(prefixOrSubspace?: GetSubspace | KeyIn | null, keyXf?: Transformer, valueXf?: Transformer) { if (isGetSubspace(prefixOrSubspace)) return new Database(this._db, prefixOrSubspace.getSubspace()) else return new Database(this._db, this.subspace.at(prefixOrSubspace, keyXf, valueXf)) } - withKeyEncoding(keyXf: Transformer): Database - withKeyEncoding(): Database - withKeyEncoding(keyXf: Transformer = defaultTransformer): Database { - return new Database(this._db, this.subspace.at(null, keyXf)) + withKeyEncoding(keyXf?: undefined): Database + withKeyEncoding(keyXf: Transformer): Database + withKeyEncoding(keyXf?: Transformer): + | Database + | Database + withKeyEncoding(keyXf?: Transformer) { + return new Database(this._db, this.subspace.withKeyEncoding(keyXf)) } - - withValueEncoding(valXf: Transformer): Database { - return new Database(this._db, this.subspace.at(null, undefined /* inherit */, valXf)) + + withValueEncoding(valueXf?: undefined): Database + withValueEncoding(valueXf: Transformer): Database + withValueEncoding(valueXf?: Transformer): + | Database + | Database + withValueEncoding(valueXf?: Transformer) { + return new Database(this._db, this.subspace.withValueEncoding(valueXf)) } // This is the API you want to use for non-trivial transactions. diff --git a/lib/subspace.ts b/lib/subspace.ts index 9c75507..d1e44f5 100644 --- a/lib/subspace.ts +++ b/lib/subspace.ts @@ -41,28 +41,28 @@ export default class Subspace; - at(prefix: KeyIn | null, keyXf: Transformer, valueXf?: undefined): Subspace; - at(prefix: KeyIn | null, keyXf: undefined, valueXf: Transformer): Subspace; - at(prefix: KeyIn | null, keyXf: Transformer, valueXf: Transformer): Subspace; - at(prefix: KeyIn | null, keyXf?: Transformer, valueXf?: undefined): + at(prefix?: KeyIn | null, keyXf?: undefined, valueXf?: undefined): Subspace; + at(prefix: KeyIn | null | undefined, keyXf: Transformer, valueXf?: undefined): Subspace; + at(prefix: KeyIn | null | undefined, keyXf: undefined, valueXf: Transformer): Subspace; + at(prefix: KeyIn | null | undefined, keyXf: Transformer, valueXf: Transformer): Subspace; + at(prefix: KeyIn | null | undefined, keyXf?: Transformer, valueXf?: undefined): | Subspace | Subspace; - at(prefix: KeyIn | null, keyXf: undefined, valueXf?: Transformer): + at(prefix: KeyIn | null | undefined, keyXf: undefined, valueXf?: Transformer): | Subspace | Subspace; - at(prefix: KeyIn | null, keyXf: Transformer | undefined, valueXf: Transformer): + at(prefix: KeyIn | null | undefined, keyXf: Transformer | undefined, valueXf: Transformer): | Subspace | Subspace; - at(prefix: KeyIn | null, keyXf: Transformer, valueXf?: Transformer): + at(prefix: KeyIn | null | undefined, keyXf: Transformer, valueXf?: Transformer): | Subspace | Subspace; - at(prefix: KeyIn | null, keyXf?: Transformer, valueXf?: Transformer): + at(prefix?: KeyIn | null, keyXf?: Transformer, valueXf?: Transformer): | Subspace | Subspace | Subspace | Subspace; - at(prefix: KeyIn | null, keyXf: Transformer = this.keyXf, valueXf: Transformer = this.valueXf) { + at(prefix?: KeyIn | null, keyXf: Transformer = this.keyXf, valueXf: Transformer = this.valueXf) { const _prefix = prefix == null ? null : this.keyXf.pack(prefix) return new Subspace(concatPrefix(this.prefix, _prefix), keyXf, valueXf) } @@ -72,13 +72,22 @@ export default class Subspace(keyXf: Transformer): Subspace { + withKeyEncoding(keyXf?: undefined): Subspace + withKeyEncoding(keyXf: Transformer): Subspace + withKeyEncoding(keyXf?: Transformer): + | Subspace + | Subspace + withKeyEncoding(keyXf?: Transformer) { return new Subspace(this.prefix, keyXf, this.valueXf) } - - withValueEncoding(valXf: Transformer): Subspace { - return new Subspace(this.prefix, this.keyXf, valXf) + + withValueEncoding(valueXf?: undefined): Subspace + withValueEncoding(valueXf: Transformer): Subspace + withValueEncoding(valueXf?: Transformer): + | Subspace + | Subspace + withValueEncoding(valueXf?: Transformer) { + return new Subspace(this.prefix, this.keyXf, valueXf) } // GetSubspace implementation