{"id":15010976,"url":"https://github.com/aesiniath/unbeliever","last_synced_at":"2025-10-08T22:17:01.210Z","repository":{"id":37626148,"uuid":"144458257","full_name":"aesiniath/unbeliever","owner":"aesiniath","description":"Opinionated Haskell Interoperability","archived":false,"fork":false,"pushed_at":"2024-10-16T12:39:55.000Z","size":1599,"stargazers_count":33,"open_issues_count":9,"forks_count":12,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-10-08T22:16:58.502Z","etag":null,"topics":["command-line","haskell","library"],"latest_commit_sha":null,"homepage":"https://hackage.haskell.org/package/unbeliever","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aesiniath.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","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":"2018-08-12T10:41:55.000Z","updated_at":"2024-10-16T12:40:00.000Z","dependencies_parsed_at":"2023-12-06T12:25:53.525Z","dependency_job_id":"6090faba-3224-4bcc-8692-388e1ffb53c2","html_url":"https://github.com/aesiniath/unbeliever","commit_stats":{"total_commits":1033,"total_committers":13,"mean_commits":79.46153846153847,"dds":0.4762826718296225,"last_synced_commit":"44dfca0c8567d98183cad6f3304a59ec41e83505"},"previous_names":[],"tags_count":131,"template":false,"template_full_name":null,"purl":"pkg:github/aesiniath/unbeliever","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aesiniath%2Funbeliever","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aesiniath%2Funbeliever/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aesiniath%2Funbeliever/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aesiniath%2Funbeliever/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aesiniath","download_url":"https://codeload.github.com/aesiniath/unbeliever/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aesiniath%2Funbeliever/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000781,"owners_count":26082851,"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","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["command-line","haskell","library"],"created_at":"2024-09-24T19:37:59.912Z","updated_at":"2025-10-08T22:17:01.167Z","avatar_url":"https://github.com/aesiniath.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"A library helping you write Haskell programs\n============================================\n\nThis library is for writing command-line applications, be they tools or\nlong-running daemons. It provides the following:\n\n  - a `Program` type encapsulating internals of logging, signal\n    handling, and exception handling;\n  - logging handlers for event tracing and application debugging carefully\n    designed so that normal output to console is not corrupted by logging\n    output or error messages;\n  - setting up what command-line parameters your program expects in a\n    declarative manner and easily looking up options and arguments at\n    runtime;\n  - a mechanism for plumbing top-level application state throughout a\n    program including support for updating that state;\n  - support for extracting metadata from the project's _.cabal_ file for\n    use in your program should you need it, for example for use in\n    `--version` output;\n  - simplified UTF-8 text handling via a `Rope` type backed by a\n    finger-tree and optimized for both conveying large passages of text and\n    appending chunks when building up texts for subsequent output to a file\n    handle, along with code facilitating conversion to other textual types;\n  - first class ANSI coloured pretty-printing support;\n  - auto-generated `--help` output that is sensitive to available terminal\n    width;\n  - wrappers around key/value maps and sets of elements optimized for\n    common cases and facilitating conversion to other dictionary and\n    collection types;\n  - and more!\n\nWhat's so opinionated about this?\n\nThis project started as an effort to record library choices, useful\nidioms, and recommended practices for teams writing Haskell programs in a\nlarge corporate environment. We quickly realized that a cookbook would be\nfar less helpful than a library which simply presented these opinions as a\nframework application developers could just use out of the box.\n\nOur approach has been to create wrapper layers around existing\nfunctionality to bring them together in a useful gestalt. There are some\nextremely powerful libraries in the Haskell ecosystem, but using them\ntogether can sometimes be difficult. Packages date from different\neras of Haskell's growth as an industrial language and so they often follow\ndifferent usage idioms making interoperability a challenge.\n\nThe working title for the as-yet unpublished text on this topic is _Haskell for\nUnbelievers_ and so **unbeliever** became the name for this library.  We've\nsince split the library into a number of packages with smaller dependency\nfootprints. This repo contains the sources for the **core-text**,\n**core-data**, and **core-program** packages on Hackage.\n\nSome goals:\n\n  - Be compatible with the builtin prelude from **base**.  One of the\n    exciting things about Haskell is the degree of experimentation that\n    researchers and engineers are able to do with the language itself, its\n    library ecosystem, and the development tooling used to build and test\n    software.  Even the basic functions and syntax of the language are\n    implemented as as a \"prelude\" library whose code is imported by default\n    into every module. There are some fascinating explorations of\n    _different_ preludes—all with an aim to improve on the well-documented\n    shortcomings of the built-in one. The original `Prelude` module remains\n    in scope by default, however, and is in use by the majority of other\n    libraries. So we set out to be compatible with (or at least able to\n    ignore) that default and thus **unbeliever** is _not_ implemented as a\n    custom prelude.\n    \n    Nothing prevents you using an alternative prelude in a program built on\n    top of this package, should you wish.\n\n    \\[We do _not_ argue that the Haskell language should never change. We'd\n    be the first ones to cheer if `String` was ripped out and tossed on the\n    dungheap of history next to VHS tapes and compters without Esc keys.\n    We can fix the textbooks! But in the present tense, if the first thing\n    a newcomer has to deal with is basic idioms they've been taught not\n    working as they've been shown to expect, it makes for an awkward\n    learning curve.\\]\n\n  - Facilitate interoperability. One of the biggest annoyances working in\n    Haskell is trying to figure out how to get a value returned from one\n    library converted to the type you need to feed into the next one you\n    are calling. This is common with textual types and when dealing with\n    sets and maps from the various containers libraries. This library\n    chooses one implementation for each of these areas and then supplies a\n    typeclass to permit conversion from our type to the types in common use\n    in other libraries.\n\n  - Make it possible to use package's modules without using qualified\n    imports. Haskell's qualified import mechanism is excellent, but often\n    leads to cumbersome looking code in type signatures and at function\n    call sites. The alternative is picking function names (which do tend to\n    be longer, alas) which do not collide with **base** and hence do not\n    require being qualified to avoid name collisions.\n\n  - Provide a place to implement common application functionality. Over\n    time, ideas about best practices evolve. Current approaches to\n    structuring programs include an outer layer over `IO` which carries the\n    application's state and makes it available to inner layers which can be\n    more restricted or better yet pure. This library includes an\n    implementation of that pattern.\n\nIf you wish to dismiss this library as a giant bikeshedding exercise you\nwould not be wrong. Hopefully you'll like the _colour_ of our bikeshed.\n\nGetting Started\n---------------\n\nTo learn about the text type, see the documentation for\n[Core.Text.Rope](https://hackage.haskell.org/package/core-text/docs/Core-Text-Rope.html).\nTo use the Program monad, you can get started by looking at\n[Core.Program.Execute](https://hackage.haskell.org/package/core-program/docs/Core-Program-Execute.html).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faesiniath%2Funbeliever","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faesiniath%2Funbeliever","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faesiniath%2Funbeliever/lists"}