{"id":19573951,"url":"https://github.com/hexresearch/fs-stats","last_synced_at":"2025-08-09T06:15:22.212Z","repository":{"id":99626026,"uuid":"100353285","full_name":"hexresearch/fs-stats","owner":"hexresearch","description":"Aggregation of statistic with file system","archived":false,"fork":false,"pushed_at":"2017-08-16T11:26:55.000Z","size":10,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":16,"default_branch":"master","last_synced_at":"2025-02-26T11:17:18.870Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hexresearch.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"2017-08-15T07:52:39.000Z","updated_at":"2017-08-16T11:56:22.000Z","dependencies_parsed_at":"2023-04-06T18:34:34.069Z","dependency_job_id":null,"html_url":"https://github.com/hexresearch/fs-stats","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/hexresearch/fs-stats","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexresearch%2Ffs-stats","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexresearch%2Ffs-stats/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexresearch%2Ffs-stats/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexresearch%2Ffs-stats/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hexresearch","download_url":"https://codeload.github.com/hexresearch/fs-stats/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexresearch%2Ffs-stats/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269538990,"owners_count":24434615,"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-08-09T02:00:10.424Z","response_time":111,"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-11T06:37:07.276Z","updated_at":"2025-08-09T06:15:22.145Z","avatar_url":"https://github.com/hexresearch.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# fs-stats: Aggregation of statistic with file system\n\nБиблиотека для сохранения статистики в виде KV-пар.\n\nСтаистики представлены закрытым типом `Kv`.\nПо сути он хранит набор значений по ключам.\nСам тип Kv закрыт, мы можем только создать новое пустое значение и сохранять значения в YAML-файл:\n\n~~~haskell\nnewKv :: IO Kv\n\nwriteKv :: FilePath -\u003e Kv -\u003e IO ()\n~~~\n\n### Ссылки Ref\n\nПользователь может добавлять и обновлять значения через интерфейс ссылок:\n\nМы можем создавать и удалять поля из KV-значения:\n\n~~~haskell\nnewRef :: IsPrimVal a =\u003e Kv -\u003e Text -\u003e a -\u003e IO (Ref a)\nnewRef kv fieldName initValue\n\nrmRef :: Kv -\u003e Text -\u003e IO ()\nrmRef kv fieldName\n~~~\n\nМы можем записывтаь, читать и обновлять значения по ссылкам:\n\n~~~haskell\nwriteRef  :: IsPrimVal a =\u003e Ref a -\u003e a -\u003e IO ()\nreadRef   :: IsPrimVal a =\u003e Ref a -\u003e IO a\nmodifyRef :: IsPrimVal a =\u003e Ref a -\u003e (a -\u003e a) -\u003e IO ()\n~~~\n\nВсе обновления происходят атомарно через STM под капотом.\n\nОбратим внимание на зависимость IsPrimVal. Этот класс содержит примитивные типы.\nОпределены инстансы для `Text`, `String`, `Int`, `Float`, `Double`, `Bool`, `Scientific`.\nТакже мы можем определить свои инстансы (см модуль `Data.Stat.Fs.PrimVal`).\n\n## Сохранение метрик\n\nМетрики хранятся в виде простого YAML-файла.\nДля сохранения можно воспользоваться функцией `writeKv`:\n\n~~~haskell\nwriteKv :: FilePath -\u003e Kv -\u003e IO ()\n~~~\n\nПример:\n\nЗапустим `stack ghci` в проекте `fs-stats`:\n\n~~~haskell\nkv    \u003c- newKv\ncount \u003c- newRef kv \"count\" (0 :: Int)\nflag  \u003c- newRef kv \"flag\" True\nevt   \u003c- newRef kv \"evt\" (\"on\" :: String)\nwriteKv \"test-stat.yaml\" kv\n\nmodifyRef count (+1)\nwriteRef evt \"off\"\nwriteKv \"test-stat.yaml\" kv\n~~~\n\nОтметим, что файл сохраняется не напрямую. а сначала создаётся временный файл,\nа затем этот файл переименовывается в файл с заданным именем.\n\n### Сохранение метрик в бесконечном цикле\n\nЧасто необходимо периодически обновлять значения метрик.\nДля этого сценария есть функция:\n\n~~~haskell\nwriteKvLoop :: NominalDiffTime -\u003e FilePath -\u003e Kv -\u003e IO ()\nwriteKvLoop timeDelta file kv\n~~~\n\nОна периодически сохраняет статистику в файл.\n\nПример:\n\nПродолжим пример из предыдущего раздела:\n\n~~~haskell\nwriteKvLoop 5 \"test-stat.yaml\" kv\n~~~\n\nДалее мы можем обновить статистику и убедиться, что значения обновились и в файле:\n\n~~~haskell\nwriteRef count 7\n~~~\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhexresearch%2Ffs-stats","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhexresearch%2Ffs-stats","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhexresearch%2Ffs-stats/lists"}