{"id":16964966,"url":"https://github.com/propensive/cardinality","last_synced_at":"2025-06-24T06:36:38.943Z","repository":{"id":49100029,"uuid":"517131647","full_name":"propensive/cardinality","owner":"propensive","description":"Dependently-typed range-checked numbers for Scala","archived":false,"fork":false,"pushed_at":"2025-02-12T19:31:50.000Z","size":2120,"stargazers_count":2,"open_issues_count":3,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-19T05:06:33.030Z","etag":null,"topics":["dependent-types","refined-types","scala","static-checks","typesafe"],"latest_commit_sha":null,"homepage":"https://soundness.dev/cardinality/","language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/propensive.png","metadata":{"files":{"readme":".github/readme.md","changelog":null,"contributing":".github/contributing.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-07-23T18:12:02.000Z","updated_at":"2025-02-12T19:31:54.000Z","dependencies_parsed_at":"2023-02-10T08:15:33.699Z","dependency_job_id":"2b7f555b-69b2-4798-adec-17c216bf24b1","html_url":"https://github.com/propensive/cardinality","commit_stats":null,"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/propensive/cardinality","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/propensive%2Fcardinality","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/propensive%2Fcardinality/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/propensive%2Fcardinality/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/propensive%2Fcardinality/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/propensive","download_url":"https://codeload.github.com/propensive/cardinality/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/propensive%2Fcardinality/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261622406,"owners_count":23185936,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dependent-types","refined-types","scala","static-checks","typesafe"],"created_at":"2024-10-13T23:44:42.580Z","updated_at":"2025-06-24T06:36:38.921Z","avatar_url":"https://github.com/propensive.png","language":"Scala","funding_links":[],"categories":[],"sub_categories":[],"readme":"[\u003cimg alt=\"GitHub Workflow\" src=\"https://img.shields.io/github/actions/workflow/status/propensive/cardinality/main.yml?style=for-the-badge\" height=\"24\"\u003e](https://github.com/propensive/cardinality/actions)\n[\u003cimg src=\"https://img.shields.io/discord/633198088311537684?color=8899f7\u0026label=DISCORD\u0026style=for-the-badge\" height=\"24\"\u003e](https://discord.com/invite/MBUrkTgMnA)\n\u003cimg src=\"/doc/images/github.png\" valign=\"middle\"\u003e\n\n# Cardinality\n\n__Constraints for constraining sets of real numbers__\n\n_Cardinality_ introduces numerically-constrained `Double` types which are as usable as ordinary `Double`s, but safely constrained to a range that\nis specified in their type.\n\n## Features\n\n- introduces `Double`s which are constrained to a numeric range, checked at compile time\n- intuitive `a ~ b` syntax for representing a ranged `Double`\n- ordinary `Double` literals can be used in positions which expect a ranged type\n- numeric ranges compose under arithmetic operations\n- escape-hatch (called `force`) for unsafe but easy conversions\n\n\n## Availability\n\n\n\n\n\n\n\n## Getting Started\n\n_Cardinality_ provides a representation of numbers which must lie within a certain (closed) range. A range type is written with the\ninfix `~` type operator, between two doubles, for example, `-1.0 ~ 1.0` represents a `Double` which is at least `-1.0` and at most\n`1.0`.\n\nCompiletime operations check `Double` literals for conformance to the claimed bounds, for example:\n```scala\nval x: 0.0 ~ 100.0 = 33.3 // good\nval y: 0.0 ~ 1.0 = 2.0    // compile error\n```\n\nStandard arithmetic operations are also implemented on ranged `Double`s. Depending on whether the right-hand operand is a statically-unknown\n`Double`, a `Double` singleton literal, or a ranged `Double`, the result will be typed as precisely as possible. For example, adding `10.0` to\nan instance of `3.0 ~ 5.0` will produce a result of type, `13.0 ~ 15.0`. These operations use typelevel arithmetic to calculate the resultant\nrange of the calculation, and can be composed like other arithmetic functions, with the return type inferred. For example,\n```scala\nvar x: 0.0 ~ 1.0 = 0.2\nvar y: -1.0 ~ 1.0 = 0.2\nvar z: 1e3 ~ 1e8 = 10000\n\nval result = (x + y*3.0)*z\n```\nwill infer the type of `result` to be `-2.0e8 ~ 3.0e8` (while its value will be `6000.0`.\n\n### Forcing values\n\nUnranged `Double`s are pervasive in Scala, so a `Double#force` extension method is provided which can be used (carefully) to convert a `Double`\nto an expected ranged type.\n\n\n\n\n\n## Status\n\nCardinality is classified as __embryotic__. For reference, Soundness projects are\ncategorized into one of the following five stability levels:\n\n- _embryonic_: for experimental or demonstrative purposes only, without any guarantees of longevity\n- _fledgling_: of proven utility, seeking contributions, but liable to significant redesigns\n- _maturescent_: major design decisions broady settled, seeking probatory adoption and refinement\n- _dependable_: production-ready, subject to controlled ongoing maintenance and enhancement; tagged as version `1.0.0` or later\n- _adamantine_: proven, reliable and production-ready, with no further breaking changes ever anticipated\n\nProjects at any stability level, even _embryonic_ projects, can still be used,\nas long as caution is taken to avoid a mismatch between the project's stability\nlevel and the required stability and maintainability of your own project.\n\nCardinality is designed to be _small_. Its entire source code currently consists\nof 187 lines of code.\n\n## Building\n\nCardinality will ultimately be built by Fury, when it is published. In the\nmeantime, two possibilities are offered, however they are acknowledged to be\nfragile, inadequately tested, and unsuitable for anything more than\nexperimentation. They are provided only for the necessity of providing _some_\nanswer to the question, \"how can I try Cardinality?\".\n\n1. *Copy the sources into your own project*\n   \n   Read the `fury` file in the repository root to understand Cardinality's build\n   structure, dependencies and source location; the file format should be short\n   and quite intuitive. Copy the sources into a source directory in your own\n   project, then repeat (recursively) for each of the dependencies.\n\n   The sources are compiled against the latest nightly release of Scala 3.\n   There should be no problem to compile the project together with all of its\n   dependencies in a single compilation.\n\n2. *Build with [Wrath](https://github.com/propensive/wrath/)*\n\n   Wrath is a bootstrapping script for building Cardinality and other projects in\n   the absence of a fully-featured build tool. It is designed to read the `fury`\n   file in the project directory, and produce a collection of JAR files which can\n   be added to a classpath, by compiling the project and all of its dependencies,\n   including the Scala compiler itself.\n   \n   Download the latest version of\n   [`wrath`](https://github.com/propensive/wrath/releases/latest), make it\n   executable, and add it to your path, for example by copying it to\n   `/usr/local/bin/`.\n\n   Clone this repository inside an empty directory, so that the build can\n   safely make clones of repositories it depends on as _peers_ of `cardinality`.\n   Run `wrath -F` in the repository root. This will download and compile the\n   latest version of Scala, as well as all of Cardinality's dependencies.\n\n   If the build was successful, the compiled JAR files can be found in the\n   `.wrath/dist` directory.\n\n## Contributing\n\nContributors to Cardinality are welcome and encouraged. New contributors may like\nto look for issues marked\n[beginner](https://github.com/propensive/cardinality/labels/beginner).\n\nWe suggest that all contributors read the [Contributing\nGuide](/contributing.md) to make the process of contributing to Cardinality\neasier.\n\nPlease __do not__ contact project maintainers privately with questions unless\nthere is a good reason to keep them private. While it can be tempting to\nrepsond to such questions, private answers cannot be shared with a wider\naudience, and it can result in duplication of effort.\n\n## Author\n\nCardinality was designed and developed by Jon Pretty, and commercial support and\ntraining on all aspects of Scala 3 is available from [Propensive\nO\u0026Uuml;](https://propensive.com/).\n\n\n\n## Name\n\nThe _cardinality_ of a set is the number of elements it contains, while _Cardinality_ controls the size of sets of `Double`s.\n\nIn general, Soundness project names are always chosen with some rationale,\nhowever it is usually frivolous. Each name is chosen for more for its\n_uniqueness_ and _intrigue_ than its concision or catchiness, and there is no\nbias towards names with positive or \"nice\" meanings—since many of the libraries\nperform some quite unpleasant tasks.\n\nNames should be English words, though many are obscure or archaic, and it\nshould be noted how willingly English adopts foreign words. Names are generally\nof Greek or Latin origin, and have often arrived in English via a romance\nlanguage.\n\n## Logo\n\nThe logo shows the hat typically worn by a cardinal, alluding to the name _Cardinality_.\n\n## License\n\nCardinality is copyright \u0026copy; 2025 Jon Pretty \u0026 Propensive O\u0026Uuml;, and\nis made available under the [Apache 2.0 License](/license.md).\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpropensive%2Fcardinality","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpropensive%2Fcardinality","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpropensive%2Fcardinality/lists"}