diff --git a/src/preserves.nim b/src/preserves.nim index 4ac8750..6ad3862 100644 --- a/src/preserves.nim +++ b/src/preserves.nim @@ -81,15 +81,26 @@ proc `==`*[A, B](x: Preserve[A]; y: Preserve[B]): bool = of pkSymbol: result = x.symbol == y.symbol of pkRecord: - result = x.record == y.record + result = x.record.len == y.record.len + for i in 0..x.record.high: + if not result: break + result = result and (x.record[i] == y.record[i]) of pkSequence: for i, val in x.sequence: if y.sequence[i] != val: return false result = true of pkSet: - result = x.set == y.set + result = x.set.len == y.set.len + for i in 0..x.set.high: + if not result: break + result = result and (x.set[i] == y.set[i]) of pkDictionary: - result = x.dict == y.dict + result = x.dict.len == y.dict.len + for i in 0..x.dict.high: + if not result: break + result = result and + (x.dict[i].key == y.dict[i].key) and + (x.dict[i].val == y.dict[i].val) of pkEmbedded: when A is B: when A is void: @@ -689,11 +700,8 @@ proc toPreserve*[T](x: T; E = void): Preserve[E] = when x.dot(key).hasCustomPragma(preservesSymbol): toSymbol(val, E) elif x.dot(key).hasCustomPragma(preservesLiteral): - when E is void: - const lit = parsePreserves(x.dot(key).getCustomPragmaVal(preservesLiteral)) - else: - let lit = parsePreserves(x.dot(key).getCustomPragmaVal(preservesLiteral), E) - lit + const lit = parsePreserves(x.dot(key).getCustomPragmaVal(preservesLiteral)) + cast[Preserve[E]](lit) else: toPreserve(val, E) when T.hasCustomPragma(unpreservable): {.fatal: "unpreservable type".} @@ -879,10 +887,7 @@ proc fromPreserve*[T, E](v: var T; pr: Preserve[E]): bool = else: false elif v.dot(key).hasCustomPragma(preservesLiteral): - when E is void: - const lit = parsePreserves(v.dot(key).getCustomPragmaVal(preservesLiteral)) - else: - let lit = parsePreserves(v.dot(key).getCustomPragmaVal(preservesLiteral), E) + const lit = parsePreserves(v.dot(key).getCustomPragmaVal(preservesLiteral)) pr == lit else: fromPreserve(val, pr)