Skip to content

Refined Types Integration

Bridge refinement types with compile-time contract verification. Import once to enable the prover to understand refinement predicates.

Quick Start

bash
npm install @typesugar/contracts-refined
typescript
// Enable refined type predicates for the prover
import "@typesugar/contracts-refined";

import { Positive, Byte } from "@typesugar/type-system";
import { contract } from "@typesugar/contracts";

@contract
function add(a: Positive, b: Positive): number {
  requires: { a > 0 && b > 0 } // Proven by type!
  ensures: { result > 0 }      // Also provable
  return a + b;
}

What Gets Registered

All built-in refinement types from @typesugar/type-system:

CategoryTypes
NumericPositive, NonNegative, Int, Byte, Port, Percentage
StringNonEmpty, Trimmed, Email, Url, Uuid
ArrayNonEmptyArray
DependentVec<N> (length-indexed vectors)

Subtyping Rules

The integration registers safe widening rules:

  • PositiveNonNegative (x > 0 implies x >= 0)
  • ByteNonNegative, Int
  • PortPositive, NonNegative, Int

Custom Refinements

typescript
import { registerRefinementPredicate } from "@typesugar/contracts-refined";

registerRefinementPredicate("PositiveEven", "$ > 0 && $ % 2 === 0");

type PositiveEven = Refined<number, "PositiveEven">;

@contract
function halve(n: PositiveEven): number {
  ensures: { result > 0 }  // Provable!
  return n / 2;
}

Learn More

Released under the MIT License.