{"id":19333498,"url":"https://github.com/zakarumych/edict","last_synced_at":"2025-05-16T17:04:19.545Z","repository":{"id":39979927,"uuid":"439923817","full_name":"zakarumych/edict","owner":"zakarumych","description":null,"archived":false,"fork":false,"pushed_at":"2025-04-07T23:34:06.000Z","size":1373,"stargazers_count":101,"open_issues_count":7,"forks_count":6,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-05-16T15:11:52.257Z","etag":null,"topics":["entity-component-system","relations","rust"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zakarumych.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"COPYING","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":"2021-12-19T17:18:37.000Z","updated_at":"2025-05-09T21:58:11.000Z","dependencies_parsed_at":"2023-02-09T11:15:55.410Z","dependency_job_id":"0ac1c581-8a9d-4498-9eab-79c12e3d7e3e","html_url":"https://github.com/zakarumych/edict","commit_stats":{"total_commits":229,"total_committers":4,"mean_commits":57.25,"dds":"0.34497816593886466","last_synced_commit":"a81104e83a6889c3e8a304efc46a0342f16b1264"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zakarumych%2Fedict","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zakarumych%2Fedict/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zakarumych%2Fedict/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zakarumych%2Fedict/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zakarumych","download_url":"https://codeload.github.com/zakarumych/edict/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254553971,"owners_count":22090420,"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":["entity-component-system","relations","rust"],"created_at":"2024-11-10T02:52:55.382Z","updated_at":"2025-05-16T17:04:19.515Z","avatar_url":"https://github.com/zakarumych.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Edict - ECS in Rust\n\nEdict is a fast, powerful and ergonomic ECS crate that expands traditional ECS feature set.\nWritten in Rust by your fellow 🦀\n\n# Basic usage 🌱\n\n```rust\nuse edict::prelude::*;\n\n// Create world instance.\nlet mut world = World::new();\n\n// Declare some components.\n#[derive(Component)]\nstruct Pos(f32, f32);\n\n// Declare some more.\n#[derive(Component)]\nstruct Vel(f32, f32);\n\n// Spawn entity with components.\nworld.spawn((Pos(0.0, 0.0), Vel(1.0, 1.0)));\n\n// Query components and iterate over views.\nfor (pos, vel) in world.view::\u003c(\u0026mut Pos, \u0026Vel)\u003e() {\n  pos.0 += vel.0;\n  pos.1 += vel.1;\n}\n\n\n// Define functions that will be used as systems.\n#[edict::system::system] // This attribute is optional, but it catches if function is not a system.\nfn move_system(pos_vel: View\u003c(\u0026mut Pos, \u0026Vel)\u003e) {\n  for (pos, vel) in pos_vel {\n    pos.0 += vel.0;\n    pos.1 += vel.1;\n  }\n}\n\n// Create scheduler to run systems. Requires \"scheduler\" feature.\nuse edict::scheduler::Scheduler;\n\nlet mut scheduler = Scheduler::new();\nscheduler.add_system(move_system);\n\n// Run systems without parallelism.\nscheduler.run_sequential(\u0026mut world);\n\n// Run systems using threads. Requires \"std\" feature.\nscheduler.run_threaded(\u0026mut world);\n\n// Or use custom thread pool.\n```\n\n# Features\n\n## Entities 🧩\n\n### Simple IDs\n\nIn *Entity* Component Systems we create entities and address them to fetch associated data.\nEdict provides [`EntityId`] type to address entities.\n\n[`EntityId`] as a world-unique identifier of an entity.\nEdict uses IDs without generation and recycling, for this purpose it employs `u64` underlying type with a few niches.\nIt is enough to create IDs non-stop for hundreds of years before running out of them.\nThis greatly simplifying serialization of the [`World`]'s state as it doesn't require any processing of entity IDs.\n\nBy default entity IDs are unique only within one [`World`].\nFor multi-world scenarios Edict provides a way to make entity IDs unique between any required combination of worlds.\n\nIDs are allocated in sequence from [`IdRange`]s that are allocated by [`IdRangeAllocator`].\nBy default [`IdRange`] that spans from 1 to `u64::MAX - 1` is used. This makes default ID allocation extremely fast.\nCustom [`IdRangeAllocator`] can be provided to [`WorldBuilder`] to use custom ID ranges.\n\nFor example in client-server architecture, server and client may use non-overlapping ID ranges.\nThus allowing state serialized on server to be transferred to client without ID mapping,\nwhich can be cumbersome when components reference entities.\n\nIn multi-server or p2p architecture [`IdRangeAllocator`] would need to communicate to allocate disjoint ID ranges for each server.\n\n### Ergonomic entity types\n\nUsing ECS may lead to lots of `.unwrap()` calls or excessive error handling.\nThere are lots of situations when entity is guaranteed to exist (for example it just returned from a view).\nTo avoid handling [`NoSuchEntity`] error when it is unreachable, Edict provides [`AliveEntity`] trait that extends [`Entity`] trait.\nVarious methods require [`AliveEntity`] handle and skip existence check.\n\n[`Entity`] and [`AliveEntity`] traits implemented for number of entity types.\n\n[`EntityId`] implements only [`Entity`] as it doesn't provide any guaranties.\n\n[`EntityBound`] is guaranteed to be alive, allowing using it in methods that doesn't handle entity absence.\nIt keeps lifetime of a [`World`] borrow, making it impossible to despawn any entity from the world.\n*Using it with wrong [`World`] may cause panic*.\n[`EntityBound`] can be acquired from relation queries.\n\n[`EntityLoc`] not only guarantees entity existence, but also contains location of the entity in the archetypes,\nallowing functions to skip lookup step when accessing entity's components.\nSimilarly to [`EntityBound`], it keeps lifetime of a [`World`] borrow, making it impossible to despawn any entity from the world.\n*Using it with wrong [`World`] may cause panic*.\n[`EntityLoc`] can be acquired from [`Entities`] query.\n\n[`EntityRef`] is special.\nIt doesn't implement [`Entity`] or [`AliveEntity`] traits since it should not be used in world methods.\nInstead it provides direct access to entity's data and allows mutations such as inserting/removing components.\n\n## Components 🛠️\n\n### Non-thread-safe types\n\nSupport for [`!Send`] and [`!Sync`] components and resources with some limitations.\n\n[`World`] itself is not sendable but shareable between threads.\nThread owning [`World`] is referred as \"main\" thread in documentation.\n\nComponents and resources that are [`!Send`] can be fetched mutably only from \"main\" thread.\nComponents and resources that are [`!Sync`] can be fetched immutably only from \"main\" thread.\nSince reference to [`World`] may exist outside \"main\" thread, [`WorldLocal`] reference should be used,\nit can be created using mutable reference to [`World`].\n\n### Components with trait and without\n\nOptional [`Component`] trait that allows implicit component type registration when component is inserted first time.\nImplicit registration uses behavior defined by [`Component`] implementation as-is.\nWhen needed, explicit registration can be done using [`WorldBuilder`] to override component behavior.\n\nNon [`Component`] types require explicit registration and\nfew methods with `_external` suffix is used with them instead of normal ones.\nOnly default registration is possible when [`World`] is already built.\nWhen needed, explicit registration can be done using [`WorldBuilder`] to override component behavior.\n\n## Entity relations 🔗\n\nA relation can be added to pair of entities, binding them together.\nQueries may fetch relations and filter entities by their relations to other entities.\nWhen either of the two entities is despawned, relation is dropped.\n[`Relation`] type may further configure behavior of the bounded entities.\n\n## Queries 🔍\n\nPowerful [`Query`] mechanism that can filter entities by components, relations and other criteria and fetch entity data.\nQueries can be mutable or immutable, sendable or non-sendable, stateful or stateless.\n\nUsing query on [`World`] creates Views.\nViews can be used to iterate over entities that match the query yielding query items.\nOr fetch single entity data.\n\n[`ViewRef`] and [`ViewMut`] are convenient type aliases to view types returned from [`World`] methods.\n\n## Runtime and compile time checks\n\nRuntime checks are available for query mutable aliasing avoidance.\n\n[`ViewRef`] and [`ViewCell`] do runtime checks allowing multiple views with aliased access coexist,\ndeferring checks to runtime that prevents invalid aliasing to occur.\n\nWhen this is not required, [`ViewMut`] and [`View`]s with compile time checks should be used instead.\n\nWhen [`View`] is expected [`ViewRef`] and [`ViewCell`] can be locked to make a [`View`].\n\n### Borrows\n\nComponent type may define borrowing operations to borrow another type from it.\nBorrowed type may be not sized, allowing slices and dyn traits to be borrowed.\nA macro to help define borrowing operations is provided.\nQueries that tries to borrow type from suitable components are provided:\n* [`BorrowAll`] borrows from all components that implement borrowing requested type.\n  Yields a [`Vec`] with borrowed values since multiple components of the entity may provide it.\n  Skips entities if none of the components provide the requested type.\n* [`BorrowAny`] borrows from first suitable component that implements borrowing requested type.\n  Yields a single value.\n  Skips entities if none of the components provide the requested type.\n* [`BorrowOne`] is configured with [`TypeId`] of component from which it should borrow requested type.\n  Panics if component doesn't provide the requested type.\n  Skips entities without the component.\n\n## Resources 📦\n\nBuilt-in type-map for singleton values called \"resources\".\nResources can be inserted into/fetched from [`World`].\nResources live separately from entities and their components.\n\n## Actions 🏃‍♂️\n\nUse [`ActionEncoder`] for recording actions and run them later with mutable access to [`World`].\nOr [`LocalActionEncoder`] instead when action is not [`Send`].\nOr convenient [`WorldLocal::defer*`] methods to defer actions to internal [`LocalActionEncoder`].\n\n## Automatic change tracking 🤖\n\nEach component instance is equipped with epoch counter that tracks last potential mutation of the component.\nQueries may read and update components epoch to track changes.\nQueries to filter recently changed components are provided with [`Modified`] type.\nLast epoch can be obtained with [`World::epoch`].\n\n## Systems ⚙️\n\nSystems is convenient way to build logic that operates on [`World`].\nEdict defines [`System`] trait to run logic on [`World`].\nAnd [`IntoSystem`] trait for types convertible to [`System`].\n\nFunctions may implement [`IntoSystem`] automatically -\nit is required to return `()` and accept arguments that implement [`FnArg`] trait.\nThere are [`FnArg`] implementations:\n\n- [`View`] and [`ViewCell`] to iterate over entities and their components.\n  Use [`View`] unless [`ViewCell`] is required to handle intra-system views conflict.\n- [`Res`] and [`ResMut`] to access resources.\n- [`ResLocal`] and [`ResMutLocal`] to access no-thread-safe resources.\n  This will make system non-sendable and force it to run on main thread.\n- [`ActionEncoder`] to record actions that mutate [`World`] state, such as entity spawning, inserting and removing components or resources.\n- [`State`] to store system's local state between runs.\n\n## Easy scheduler 📅\n\n[`Scheduler`] is provided to run [`System`]s.\nSystems added to the [`Scheduler`] run in parallel where possible,\nhowever they act **as if** executed sequentially in order they were added.\n\nIf systems do not conflict they may be executed in parallel.\n\nIf systems conflict, the one added first will be executed before the one added later can start.\n\n`std` threads or `rayon` can be used as an executor.\nUser may provide custom executor by implementing [`ScopedExecutor`] trait.\n\nRequires `\"scheduler\"` feature which is enabled by default.\n\n## Hooks 🎣\n\nComponent replace/drop hooks are called automatically when component is replaced or dropped.\n\nWhen component is registered it can be equipped with hooks to be called when component value is replaced or dropped.\nImplicit registration of [`Component`] types will register hooks defined on the trait impl.\n\nDrop hook is called when component is dropped via [`World::drop`] or entity is despawned and is not\ncalled when component is removed from entity.\n\nReplace hook is called when component is replaced e.g. component is inserted into entity\nand entity already has component of the same type.\nReplace hook returns boolean value that indicates if drop hook should be called for replaced component.\n\nHooks can record actions into provided [`LocalActionEncoder`] that will be executed\nbefore [`World`] method that caused the hook to be called returns.\n\nWhen component implements [`Component`] trait, hooks defined on the trait impl are registered automatically to call\n[`Component::on_drop`] and [`Component::on_replace`] methods.\nThey may be overridden with custom hooks using [`WorldBuilder`].\nFor non [`Component`] types hooks can be registered only via [`WorldBuilder`].\nDefault registration with [`World`] will not register any hooks.\n\n## Async-await ⏳\n\nFutures executor to run logic that requires waiting for certain conditions or events\nor otherwise spans for multiple ticks.\n\nLogic that requires waiting can be complex to implement using systems.\nSystems run in loop and usually work on every entity with certain components.\nImplementing waiting logic would require adding waiting state to existing or new components and\nlogic would be spread across many system runs or even many systems.\n\nFutures may use `await` syntax to wait for certain conditions or events.\nFutures that can access ECS data are referred in Edict as \"flows\".\n\nFlows can be spawned in the [`World`] using [`World::spawn_flow`] or [`FlowWorld::spawn_flow`] method.\n[`Flows`] type is used as an executor to run spawned flows.\n\nFlows can be bound to an entity and spawned using [`World::spawn_flow_for`], [`FlowWorld::spawn_flow_for`], [`EntityRef::spawn_flow`] or [`FlowEntity::spawn_flow`] method.\nSuch flows will be cancelled if entity is despawned.\n\nFunctions that return futures may serve as flows.\nFor [`World::spawn_flow`] use function or closure with signature `FnOnce(FlowWorld) -\u003e Future`\nFor [`World::spawn_flow_for`] use function or closure with signature `FnOnce(FlowEntity) -\u003e Future`\n\nUser may implement low-level futures using `poll*` methods of [`FlowWorld`] and [`FlowEntity`] to access tasks [`Context`].\nEdict provides only a couple of low-level futures that will do the waiting:\n- [`yield_now!`] yields control to the executor once and resumes on next execution.\n- [`FlowEntity::wait_despawned`] waits until entity is despawned.\n- [`FlowEntity::wait_has_component`] waits until entity get a component.\n\n[`WakeOnDrop`] component can be used when despawning entity should wake a task.\n\nIt is recommended to use flows for high-level logic that spans multiple ticks\nand use systems to do low-level logic that runs every tick.\nFlows may request systems to perform operations by adding special components to entities.\nAnd systems may spawn flows to do long-running operations.\n\nRequires `\"flow\"` feature which is enabled by default.\n\n# no_std support\n\nEdict can be used in `no_std` environment but requires `alloc` crate.\n`\"std\"` feature is enabled by default.\n\nIf \"std\" feature is not enabled error types will not implement [`std::error::Error`].\n\nWhen \"flow\" feature is enabled and \"std\" is not, extern functions are used to implement TLS.\nApplication must provide implementation for these functions or linking will fail.\n\n\"scheduler\" feature enables [`Scheduler`] type.\n\"threaded-scheduler\" feature enables multithreaded execution for [`Scheduler`], using [`Scheduler::run_with`] and [`Scheduler::run_threaded`].\n\"rayon-scheduler\" feature enables also rayon based execution for [`Scheduler`] using [`Scheduler::run_rayon`].\n\n[`!Send`]: https://doc.rust-lang.org/std/marker/trait.Send.html\n[`!Sized`]: https://doc.rust-lang.org/std/marker/trait.Sized.html\n[`!Sync`]: https://doc.rust-lang.org/std/marker/trait.Sync.html\n[`ActionEncoder`]: https://docs.rs/edict/1.0.0-rc7/edict/action/struct.ActionEncoder.html\n[`AliveEntity`]: https://docs.rs/edict/1.0.0-rc7/edict/entity/trait.AliveEntity.html\n[`BorrowAll`]: https://docs.rs/edict/1.0.0-rc7/edict/query/struct.BorrowAll.html\n[`BorrowAny`]: https://docs.rs/edict/1.0.0-rc7/edict/query/struct.BorrowAny.html\n[`BorrowOne`]: https://docs.rs/edict/1.0.0-rc7/edict/query/struct.BorrowOne.html\n[`Component`]: https://docs.rs/edict/1.0.0-rc7/edict/component/trait.Component.html\n[`Component::on_drop`]: https://docs.rs/edict/1.0.0-rc7/edict/component/trait.Component.html#method.on_drop\n[`Component::on_replace`]: https://docs.rs/edict/1.0.0-rc7/edict/component/trait.Component.html#method.on_replace\n[`Context`]: https://doc.rust-lang.org/std/task/struct.Context.html\n[`Entities`]: https://docs.rs/edict/1.0.0-rc7/edict/query/struct.Entities.html\n[`Entity`]: https://docs.rs/edict/1.0.0-rc7/edict/entity/trait.Entity.html\n[`EntityBound`]: https://docs.rs/edict/1.0.0-rc7/edict/entity/trait.EntityBound.html\n[`EntityId`]: https://docs.rs/edict/1.0.0-rc7/edict/entity/struct.EntityId.html\n[`EntityLoc`]: https://docs.rs/edict/1.0.0-rc7/edict/entity/struct.EntityLoc.html\n[`EntityRef`]: https://docs.rs/edict/1.0.0-rc7/edict/entity/struct.EntityRef.html\n[`EntityRef::spawn_flow`]: https://docs.rs/edict/1.0.0-rc7/edict/entity/struct.EntityRef.html#method.spawn_flow\n[`flow`]: https://docs.rs/edict/1.0.0-rc7/edict/flow/index.html\n[`FlowEntity`]: https://docs.rs/edict/1.0.0-rc7/edict/flow/struct.FlowEntity.html\n[`FlowEntity::spawn_flow`]: https://docs.rs/edict/1.0.0-rc7/edict/flow/struct.FlowEntity.html#method.spawn_flow\n[`FlowEntity::wait_despawned`]: https://docs.rs/edict/1.0.0-rc7/edict/flow/struct.FlowEntity.html#method.wait_despawned\n[`FlowEntity::wait_has_component`]: https://docs.rs/edict/1.0.0-rc7/edict/flow/struct.FlowEntity.html#method.wait_has_component\n[`Flows`]: https://docs.rs/edict/1.0.0-rc7/edict/flow/struct.Flows.html\n[`Flows::execute`]: https://docs.rs/edict/1.0.0-rc7/edict/flow/struct.Flows.html#method.execute\n[`FlowWorld`]: https://docs.rs/edict/1.0.0-rc7/edict/flow/struct.FlowWorld.html\n[`FlowWorld::spawn_flow`]: https://docs.rs/edict/1.0.0-rc7/edict/flow/struct.FlowWorld.html#method.spawn_flow\n[`FlowWorld::spawn_flow_for`]: https://docs.rs/edict/1.0.0-rc7/edict/flow/struct.FlowWorld.html#method.spawn_flow_for\n[`FnArg`]: https://docs.rs/edict/1.0.0-rc7/edict/system/trait.FnArg.html\n[`IdRange`]: https://docs.rs/edict/1.0.0-rc7/edict/entity/struct.IdRange.html\n[`IdRangeAllocator`]: https://docs.rs/edict/1.0.0-rc7/edict/entity/trait.IdRangeAllocator.html\n[`IntoSystem`]: https://docs.rs/edict/1.0.0-rc7/edict/system/trait.IntoSystem.html\n[`LocalActionEncoder`]: https://docs.rs/edict/1.0.0-rc7/edict/action/struct.LocalActionEncoder.html\n[`Modified`]: https://docs.rs/edict/1.0.0-rc7/edict/query/struct.Modified.html\n[`NoSuchEntity`]: https://docs.rs/edict/1.0.0-rc7/edict/struct.NoSuchEntity.html\n[`Query`]: https://docs.rs/edict/1.0.0-rc7/edict/query/trait.Query.html\n[`Relation`]: https://docs.rs/edict/1.0.0-rc7/edict/relation/trait.Relation.html\n[`Res`]: https://docs.rs/edict/1.0.0-rc7/edict/resources/struct.Res.html\n[`ResMut`]: https://docs.rs/edict/1.0.0-rc7/edict/resources/struct.ResMut.html\n[`ResLocal`]: https://docs.rs/edict/1.0.0-rc7/edict/system/struct.ResLocal.html\n[`ResMutLocal`]: https://docs.rs/edict/1.0.0-rc7/edict/system/struct.ResMutLocal.html\n[`Scheduler`]: https://docs.rs/edict/1.0.0-rc7/edict/scheduler/struct.Scheduler.html\n[`Scheduler::run_rayon`]: https://docs.rs/edict/1.0.0-rc7/edict/scheduler/struct.Scheduler.html#method.run_rayon\n[`Scheduler::run_threaded`]: https://docs.rs/edict/1.0.0-rc7/edict/scheduler/struct.Scheduler.html#method.run_threaded\n[`Scheduler::run_with`]: https://docs.rs/edict/1.0.0-rc7/edict/scheduler/struct.Scheduler.html#method.run_with\n[`ScopedExecutor`]: https://docs.rs/edict/1.0.0-rc7/edict/scheduler/trait.ScopedExecutor.html\n[`Send`]: https://doc.rust-lang.org/std/marker/trait.Send.html\n[`Sized`]: https://doc.rust-lang.org/std/marker/trait.Sized.html\n[`State`]: https://docs.rs/edict/1.0.0-rc7/edict/system/struct.State.html\n[`std::error::Error`]: https://doc.rust-lang.org/std/error/trait.Error.html\n[`Sync`]: https://doc.rust-lang.org/std/marker/trait.Sync.html\n[`System`]: https://docs.rs/edict/1.0.0-rc7/edict/system/trait.System.html\n[`TypeId`]: https://doc.rust-lang.org/std/any/struct.TypeId.html\n[`Vec`]: https://doc.rust-lang.org/std/vec/struct.Vec.html\n[`View`]: https://docs.rs/edict/1.0.0-rc7/edict/view/type.View.html\n[`ViewCell`]: https://docs.rs/edict/1.0.0-rc7/edict/view/type.ViewCell.html\n[`ViewMut`]: https://docs.rs/edict/1.0.0-rc7/edict/view/type.ViewMut.html\n[`ViewRef`]: https://docs.rs/edict/1.0.0-rc7/edict/view/type.ViewRef.html\n[`WakeOnDrop`]: https://docs.rs/edict/1.0.0-rc7/edict/flow/struct.WakeOnDrop.html\n[`World`]: https://docs.rs/edict/1.0.0-rc7/edict/world/struct.World.html\n[`World::drop`]: https://docs.rs/edict/1.0.0-rc7/edict/world/struct.World.html#method.drop\n[`World::epoch`]: https://docs.rs/edict/1.0.0-rc7/edict/world/struct.World.html#method.epoch\n[`World::spawn_flow`]: https://docs.rs/edict/1.0.0-rc7/edict/world/struct.World.html#method.spawn_flow\n[`World::spawn_flow_for`]: https://docs.rs/edict/1.0.0-rc7/edict/world/struct.World.html#method.spawn_flow_for\n[`WorldBuilder`]: https://docs.rs/edict/1.0.0-rc7/edict/world/struct.WorldBuilder.html\n[`WorldLocal`]: https://docs.rs/edict/1.0.0-rc7/edict/world/struct.WorldLocal.html\n[`WorldLocal::defer*`]: https://docs.rs/edict/1.0.0-rc7/edict/world/struct.WorldLocal.html#method.defer\n[`yield_now!`]: https://docs.rs/edict/1.0.0-rc7/edict/flow/macro.yield_now.html\n\n## License\n\nLicensed under either of\n\n* Apache License, Version 2.0, ([license/APACHE](license/APACHE) or http://www.apache.org/licenses/LICENSE-2.0)\n* MIT license ([license/MIT](license/MIT) or http://opensource.org/licenses/MIT)\n\nat your option.\n\n## Contributions\n\nUnless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzakarumych%2Fedict","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzakarumych%2Fedict","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzakarumych%2Fedict/lists"}