{-# OPTIONS_GHC -Wno-unused-imports #-}
{-# OPTIONS_GHC -Wno-unused-top-binds #-}

-- |
--
-- Module: ECS
-- Description: The ECS standing at the core of Mischief.
--
-- This library contains the ECS used by the Mischief Game Engine.
module Mischief.ECS
  ( -- * Learn You an ECS for Great Mischief!
    -- $tutorials
    module Mischief.ECS.Exports,
    module Mischief.ECS.Components,
    module Mischief.ECS.Components.Required,
    module Mischief.ECS.Components.Common,
    module Mischief.ECS.Entities,
    module Mischief.ECS.World.Query,
    module Mischief.ECS.World.Query.QueryFilter,
    module Mischief.ECS.World.Query.Markers,
    module Mischief.ECS.World.Query.TH,
    module Mischief.ECS.World.Insert,
    module Mischief.ECS.World.Remove,
    module Mischief.ECS.World.Spawn,
    module Mischief.ECS.Resources,
    module Mischief.ECS.EventDef,
    module Mischief.ECS.World,
    module Mischief.ECS.Time,
    module Mischief.ECS.World.Defer,
    module Mischief.ECS.App,
    module Mischief.ECS.App.Plugins,
    module Mischief.ECS.App.Schedules,
    module Mischief.ECS.Systems,
    module Mischief.ECS.Log,
    module Mischief.ECS.Utils,
    module Mischief.ECS.Events,
    module Mischief.ECS.Components.HooksDef,
    module Mischief.ECS.Hooks,
    module Mischief.ECS.Components.Bundle,
    module Mischief.ECS.Timer,
    module Mischief.ECS.World.Query.Pipe,
    module Mischief.ECS.Observer,
    module Mischief.ECS.Fixed,
    module Data.Function,
    module Mischief.ECS.Relationships.ChildOf,
    module Mischief.ECS.World.Query.Queryable,
    module Mischief.ECS.Relationships.Order,
    module Mischief.ECS.Repeater,
    module Mischief.ECS.Components.Spawn,
  )
where

import Data.Function ((&))
import Mischief.ECS.App (App, addPlugin, newApp, runApp)
import Mischief.ECS.App.Plugins (Dependency, Plugin (..), dep)
import Mischief.ECS.App.Schedules (PostStartup, PostUpdate, PreStartup, PreUpdate, Schedule, Startup, StartupSchedule (..), Update, UpdateSchedule (..), scheduleEntity)
import Mischief.ECS.Components (Component (..), From (..), Rel (..), Res (..), Tick (..))
import Mischief.ECS.Components.Bundle (Bundle, BundleBuilder, BundleEq, BundleEqBuilder, bundle, bundleEq)
import Mischief.ECS.Components.Common (Name (..))
import Mischief.ECS.Components.HooksDef (Hook, HookContext (..), HookContextRel (..), HookRel)
import Mischief.ECS.Components.Required (require)
import Mischief.ECS.Components.Spawn (meta)
import Mischief.ECS.Entities (Entity)
import Mischief.ECS.EventDef (Event)
import Mischief.ECS.Events (OnAdd (..), OnAddRel (..), OnRemove (..), OnRemoveRel (..), OnSet (..), OnSetRel (..), trigger)
import Mischief.ECS.Exports
import Mischief.ECS.Fixed (FixedFrequency (..), FixedPlugin, FixedPostUpdate, FixedPreUpdate, FixedUpdate)
import Mischief.ECS.Hooks (hook, hookRel)
import Mischief.ECS.Log
import Mischief.ECS.Observer (Observer (..))
import Mischief.ECS.Relationships.ChildOf (ChildOf (..))
import Mischief.ECS.Relationships.Order (Before (..))
import Mischief.ECS.Repeater
import Mischief.ECS.Resources (insertRes, res, resOrInsert, resOrInsertM)
import Mischief.ECS.Systems (after, before, order, schedule, systems, unschedule, unschedule')
import Mischief.ECS.Time (Time, TimePlugin)
import Mischief.ECS.Timer (Timer)
import Mischief.ECS.Utils (expect, mapLeft, unwrap)
import Mischief.ECS.World (MonadSystem, ParSystem, System, runWhen)
import Mischief.ECS.World.Defer (defer, delay, flush, runAfter)
import Mischief.ECS.World.Insert (insert, insertIfNeq, insertNew)
import Mischief.ECS.World.Par (par, par', parFor, parFor', parFor'_, parFor_)
import Mischief.ECS.World.Query (Query, check, mkGet, mkGet', mkQuery, mkQuery', query, queryOne, query_, runWhenOne, runWhenQ, single)
import Mischief.ECS.World.Query.Markers (Any (..), C (..), E (..), Has (..), HasR (..), M (..), MR (..), Q (..), Q' (..), R (..), R' (..))
import Mischief.ECS.World.Query.Pipe
import Mischief.ECS.World.Query.QueryFilter (QueryFilter (..))
import Mischief.ECS.World.Query.Queryable (Queryable)
import Mischief.ECS.World.Query.TH (q, qd, qf)
import Mischief.ECS.World.Remove (remove)
import Mischief.ECS.World.Spawn (despawn, spawn, spawnDefer, spawn_)

-- $tutorials
-- The official Mischief book.
--
-- You can read chapters and subchapters in any order.
-- The @Startup Guide@ (1.1) is heavily recommended if this is your first time using Mischief.
--
-- * 1. Introduction
--
--     * 1.1 [Startup Guide]("Mischief.ECS.Tutorial.Introduction.Startup")
--     * 1.2 [Coding a Dungeon Game]("Mischief.ECS.Tutorial.Introduction.Dungeon")
--
-- * 2. Guides
--
--     * 2.1 [Organizing your Project]("Mischief.ECS.Tutorial.Guides.Organizing")
--     * 2.2 [Entities and Components Basics]("Mischief.ECS.Tutorial.Guides.Basics")
--     * 2.3 [Query Basics]("Mischief.ECS.Tutorial.Guides.QueryBasics")
--     * 2.4 [Query Piping]("Mischief.ECS.Tutorial.Guides.QueryPiping")
--     * 2.5 [Quasi-Query Conversion]("Mischief.ECS.Tutorial.Guides.QuasiConversion")
--     * 2.6 [Monadic Queries]("Mischief.ECS.Tutorial.Guides.MonadicQueries")
--     * 2.7 [Scheduling and Running Systems]("Mischief.ECS.Tutorial.Guides.Scheduling")
--     * 2.8 [Keeping Track of Time]("Mischief.ECS.Tutorial.Guides.Time")
--     * 2.9 [Parallelism and Asynchronicity]("Mischief.ECS.Tutorial.Guides.Parallelism")
--     * 2.10 [Events and Messages]("Mischief.ECS.Tutorial.Guides.Events")
--     * 2.11 [Change Detection]("Mischief.ECS.Tutorial.Guides.Change")