{"id":19910050,"url":"https://github.com/aitoroses/bs-parse","last_synced_at":"2025-09-18T16:42:39.889Z","repository":{"id":67181570,"uuid":"178599720","full_name":"aitoroses/bs-parse","owner":"aitoroses","description":"A monadic parser combinator library for ReasonML and Javascript","archived":false,"fork":false,"pushed_at":"2019-03-30T19:02:56.000Z","size":101,"stargazers_count":8,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-03T03:37:57.628Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"OCaml","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/aitoroses.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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,"zenodo":null}},"created_at":"2019-03-30T19:02:15.000Z","updated_at":"2021-06-12T16:43:50.000Z","dependencies_parsed_at":"2023-06-10T05:15:37.159Z","dependency_job_id":null,"html_url":"https://github.com/aitoroses/bs-parse","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/aitoroses/bs-parse","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aitoroses%2Fbs-parse","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aitoroses%2Fbs-parse/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aitoroses%2Fbs-parse/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aitoroses%2Fbs-parse/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aitoroses","download_url":"https://codeload.github.com/aitoroses/bs-parse/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aitoroses%2Fbs-parse/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275797763,"owners_count":25530253,"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-09-18T02:00:09.552Z","response_time":77,"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":[],"created_at":"2024-11-12T21:17:23.497Z","updated_at":"2025-09-18T16:42:39.881Z","avatar_url":"https://github.com/aitoroses.png","language":"OCaml","funding_links":[],"categories":[],"sub_categories":[],"readme":"# bs-parse\n\nA monadic parser combinator library\n\nThe Combinators module provides a basic set of combinators for parsing that can be composed in more complex parsers.\n\n\n## Installation\n```\nnpm install --save @glennsl/bs-json\n```\n\nThen add `bs-parse` to bs-dependencies in your bsconfig.json:\n```\n{\n  ...\n  \"bs-dependencies\": [\"@glennsl/bs-json\"]\n}\n```\n\n## Documentation\n\nIn progress.\n\nPlease refer to `Scheme` and `Json` modules. They provide some easy reference implementations of parsers and evaluators.\n\nTests also illustrate some good usage examples.\n\n## Example\n\n### Json Parser\n\nin 31 lines\n\n```ocaml\nopen Combinators;\nopen CommonCombinators;\ntype json =\n    | JUndefined\n    | JNull\n    | JNumber(float)\n    | JString(string)\n    | JBool(bool)\n    | JArray(array(json))\n    | JObject(array((string,json)));\n\nlet undefined = string(\"undefined\") \u003c$\u003e _ =\u003e JUndefined\nlet null = string(\"null\") \u003c$\u003e _ =\u003e JNull\nlet trueBool = string(\"true\") \u003c$\u003e _ =\u003e JBool(true)\nlet falseBool = string(\"false\") \u003c$\u003e _ =\u003e JBool(false)\nlet bools = trueBool \u003c|\u003e lazy falseBool\nlet quotedString = str \u003c$\u003e s =\u003e JString(s)\nlet number = number \u003c$\u003e numberStr =\u003e JNumber(float_of_string(numberStr))\nlet literal = undefined \u003c|\u003e lazy null \u003c|\u003e lazy bools \u003c|\u003e lazy quotedString \u003c|\u003e lazy number;\nlet objectMemberP = expr =\u003e\n    regex(\"\\\"([^\\\"]*)\\\"\\s*:\\s*\") \u003e\u003e= captured =\u003e  \n    expr \u003c$\u003e value =\u003e {\n        let key = captured-\u003eArray.get(1);\n        (key, value)\n    }\nlet objP = expr =\u003e surround(string(\"{\"), sepBy(string(\",\"))(objectMemberP(expr) |\u003e spaceAround), string(\"}\")) \u003c$\u003e res =\u003e JObject(res)\nlet arrayP = expr =\u003e surround(string(\"[\"), sepBy(string(\",\"))(expr |\u003e spaceAround), string(\"]\")) \u003c$\u003e res =\u003e JArray(res)\nlet rec expr = lazy (literal \u003c|\u003e lazy objP(Lazy.force(expr)) \u003c|\u003e lazy arrayP(Lazy.force(expr)))\nlet objectMember = objectMemberP(Lazy.force(expr))\nlet obj = objP(Lazy.force(expr))\nlet array = arrayP(Lazy.force(expr))\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faitoroses%2Fbs-parse","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faitoroses%2Fbs-parse","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faitoroses%2Fbs-parse/lists"}