{"id":15790513,"url":"https://github.com/cmfcmf/squeakutils","last_synced_at":"2026-01-08T19:04:10.421Z","repository":{"id":66346415,"uuid":"184401147","full_name":"cmfcmf/SqueakUtils","owner":"cmfcmf","description":"Some small utilities I use in my Squeak image","archived":false,"fork":false,"pushed_at":"2021-12-04T16:47:02.000Z","size":76,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-10-11T22:15:31.551Z","etag":null,"topics":["smalltalk","squeak"],"latest_commit_sha":null,"homepage":null,"language":"Smalltalk","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/cmfcmf.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}},"created_at":"2019-05-01T10:32:21.000Z","updated_at":"2021-12-04T16:47:05.000Z","dependencies_parsed_at":"2023-02-21T23:46:37.200Z","dependency_job_id":null,"html_url":"https://github.com/cmfcmf/SqueakUtils","commit_stats":{"total_commits":43,"total_committers":1,"mean_commits":43.0,"dds":0.0,"last_synced_commit":"90201ea08df623446cedb3da489cc6ed17fccd01"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cmfcmf%2FSqueakUtils","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cmfcmf%2FSqueakUtils/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cmfcmf%2FSqueakUtils/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cmfcmf%2FSqueakUtils/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cmfcmf","download_url":"https://codeload.github.com/cmfcmf/SqueakUtils/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246521299,"owners_count":20791095,"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":["smalltalk","squeak"],"created_at":"2024-10-04T22:21:42.266Z","updated_at":"2026-01-08T19:04:05.381Z","avatar_url":"https://github.com/cmfcmf.png","language":"Smalltalk","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SqueakUtils\n\nThis repository contains a few utilities I use in my Squeak image.\n\n## Miscellaneous Stuff\n\n### Temporary Subclasses\n\nSometimes I want to create a subclass on the fly, without worrying about class name and category. For example, imagine wanting a stepping `Morph` that flashes red and green. You can use the `Object \u003e\u003e #tmpSubclass:` message to create a new temporary subclass that overwrites the specified methods.\nThis will create a new subclass in the `TmpClasses` category with a unique name and `becomeForward` the instance it is called on.\nTemporary subclasses are cleaned up on shutdown if no more instances of them are remaining.\n\n```\nc := CircleMorph new.\nc tmpSubclass: {\n\t#stepTime -\u003e [500].\n\t#step -\u003e [\n\t\tself color = Color green\n\t\t\tifTrue: [self color: Color red]\n\t\t\tifFalse: [self color: Color green]]}.\nc startStepping.\nc openInHand\n```\n\n### Comparative Benchmarking\n\nSometimes you want to compare the execution speed of two or more blocks. While you could simply send `bench` to all blocks you're interested in, this package provides simpler alternatives for comparing up to four blocks: `BlockClosure \u003e\u003e #vs:`, `BlockClosure \u003e\u003e #vs:vs:`, `BlockClosure \u003e\u003e #vs:vs:vs:`. Example:\n\n```\n[10 factorial] vs: [20 factorial]\n```\n\n```\n '6,100,000 per second. 164 nanoseconds per run.\nvs. 1,160,000 per second. 863 nanoseconds per run.'\n```\n\nOriginal idea by @tom95.\n\n## Battery Indicator Morph and OpenMensa Morph\n\nBoth can be installed via:\n```\nMetacello new\n\tbaseline: 'Cmfcmf';\n\trepository: 'github://cmfcmf/SqueakUtils:master';\n\tload.\n```\n\n### Battery Indicator\n\nYou can create your very own battery indicator morph using `CMFBatteryMorph new openInHand`. \nThe morph updates every two minutes.\n\n### OpenMensa Morph\n\nI provide a custom morph that displays the daily meals from https://openmensa.org. To open it, execute `CMFMensaInfo open`.\n\n## Windows FFI Utils\n\nI provide methods for creating processes and pipes using FFI under Windows. To install just them, use:\n```\nMetacello new\n\tbaseline: 'Cmfcmf';\n\trepository: 'github://cmfcmf/SqueakUtils:master';\n\tload: #('winffi').\n```\n  \n## Toolbuilder Extensions (broken in Squeak 5.3+)\n\nI provide a customized `PluggableMultiColumnListMorph` and spec. In contrast to the default implementation, it has gained the following enhancements:\n- the list is filterable\n- the items are indexed by row, not by column\n\nTo install just them, use:\n```\nMetacello new\n\tbaseline: 'Cmfcmf';\n\trepository: 'github://cmfcmf/SqueakUtils:master';\n\tload: #('toolbuilder').\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcmfcmf%2Fsqueakutils","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcmfcmf%2Fsqueakutils","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcmfcmf%2Fsqueakutils/lists"}