Ship

Book · Module Signatures

Module Signatures

Draft

Check several file modules against reusable named and anonymous signatures.

Projects used

The linked store-modules project owns the complete example: src/Store.shp, src/Snapshot.shp, and the implementations under src/Stores/. Keeping those files in one ordinary project makes the module layout, implementation headers, and runnable entry visible together.

Store.shp declares its primary module type T. Both Stores/Flat.shp and Stores/JSON.shp begin with module: Store;, so their private representations differ while callers see the same operations.

Store Implementations

test✓
  let flatflat: $project.6578616d706c65732f626f6f6b2f73746f72652d6d6f64756c6573.Stores.Flat = StoreModules.Stores.Flat.createcreate: pure fn!(value: String) -> $project.6578616d706c65732f626f6f6b2f73746f72652d6d6f64756c6573.Stores.Flat("flat""flat": String);
  ✓flatflat: $project.6578616d706c65732f626f6f6b2f73746f72652d6d6f64756c6573.Stores.Flat: StoreModules.Stores.Flat;

  let jsonjson: $project.6578616d706c65732f626f6f6b2f73746f72652d6d6f64756c6573.Stores.JSON = StoreModules.Stores.JSON.createcreate: pure fn!(value: String) -> $project.6578616d706c65732f626f6f6b2f73746f72652d6d6f64756c6573.Stores.JSON("json""json": String);
  expect ✓(
    StoreModules.Stores.Flat.readread: pure fn!(store: $project.6578616d706c65732f626f6f6b2f73746f72652d6d6f64756c6573.Stores.Flat) -> String(flatflat: $project.6578616d706c65732f626f6f6b2f73746f72652d6d6f64756c6573.Stores.Flat),
    StoreModules.Stores.JSON.readread: pure fn!(store: $project.6578616d706c65732f626f6f6b2f73746f72652d6d6f64756c6573.Stores.JSON) -> String(jsonjson: $project.6578616d706c65732f626f6f6b2f73746f72652d6d6f64756c6573.Stores.JSON),
  ) == ("flat""flat": String, "json""json": String);

Stores/Versioned.shp keeps one file header while composing the Store and Snapshot requirements with an anonymous #{ ... } signature.

Composite Signature

test✓
  let storestore: $project.6578616d706c65732f626f6f6b2f73746f72652d6d6f64756c6573.Stores.Versioned = StoreModules.Stores.Versioned.createcreate: pure fn!(value: String) -> $project.6578616d706c65732f626f6f6b2f73746f72652d6d6f64756c6573.Stores.Versioned("versioned""versioned": String);
  ✓storestore: $project.6578616d706c65732f626f6f6b2f73746f72652d6d6f64756c6573.Stores.Versioned: StoreModules.Stores.Versioned;
  expect ✓(
    StoreModules.Stores.Versioned.readread: pure fn!(store: $project.6578616d706c65732f626f6f6b2f73746f72652d6d6f64756c6573.Stores.Versioned) -> String(storestore: $project.6578616d706c65732f626f6f6b2f73746f72652d6d6f64756c6573.Stores.Versioned),
    StoreModules.Stores.Versioned.snapshotsnapshot: pure fn!(store: $project.6578616d706c65732f626f6f6b2f73746f72652d6d6f64756c6573.Stores.Versioned) -> Int(storestore: $project.6578616d706c65732f626f6f6b2f73746f72652d6d6f64756c6573.Stores.Versioned),
  ) == ("versioned""versioned": String, 11: Int);