1515module Aztecs.ECS.Schedule.Internal where
1616
1717import Aztecs.ECS.Access.Internal
18- import Aztecs.ECS.HSet (HSetT (.. ), Run )
18+ import Aztecs.ECS.HSet (HSet (.. ), Run )
1919import Aztecs.ECS.Queryable.Internal
2020import Aztecs.ECS.System
21- import Control.Monad.Identity
2221import Data.Kind
2322
2423class Schedule m s where
@@ -78,24 +77,27 @@ type family If (condition :: Bool) (then_ :: k) (else_ :: k) :: k where
7877 If 'True then_ else_ = then_
7978 If 'False then_ else_ = else_
8079
81- instance Schedule m (HSetT (IdentityT m ) '[] ) where
82- type Scheduled m (HSetT (IdentityT m ) '[] ) = HSetT (HSetT (IdentityT m )) '[]
80+ type family GroupsToNestedHSet m (groups :: [[Type ]]) :: [Type ] where
81+ GroupsToNestedHSet m '[] = '[]
82+ GroupsToNestedHSet m (group ': rest ) = HSet (MapToIdentityT m group ) ': GroupsToNestedHSet m rest
83+
84+ instance Schedule m (HSet '[] ) where
85+ type Scheduled m (HSet '[] ) = HSet '[]
8386 schedule HEmpty = HEmpty
8487
85- instance (System m sys ) => Schedule m (HSetT (IdentityT m ) '[sys ]) where
86- type Scheduled m (HSetT (IdentityT m ) '[sys ]) = HSetT (HSetT (IdentityT m )) (GroupSystems m '[sys ])
87- schedule (HCons (IdentityT sys) HEmpty ) =
88- HCons (HCons (IdentityT sys) HEmpty ) HEmpty
88+ instance (System m sys ) => Schedule m (HSet '[sys ]) where
89+ type Scheduled m (HSet '[sys ]) = HSet (GroupsToNestedHSet m (GroupSystems m '[sys ]))
90+ schedule (HCons sys HEmpty ) = HCons (HCons sys HEmpty ) HEmpty
8991
9092instance
9193 ( System m sys ,
9294 AllSystems m rest ,
9395 rest ~ (sys2 ': rest' ),
9496 CompileGroups m (GroupSystems m (sys ': rest )) (sys ': rest )
9597 ) =>
96- Schedule m (HSetT ( IdentityT m ) (sys ': rest ))
98+ Schedule m (HSet (sys ': rest ))
9799 where
98- type Scheduled m (HSetT ( IdentityT m ) ( sys ': rest )) = HSetT ( HSetT ( IdentityT m )) (GroupSystems m (sys ': rest ))
100+ type Scheduled m (HSet ( sys ': rest )) = HSet ( GroupsToNestedHSet m (GroupSystems m (sys ': rest ) ))
99101 schedule = compileGroups @ m @ (GroupSystems m (sys ': rest )) @ (sys ': rest )
100102
101103class AllSystems m systems
@@ -107,7 +109,7 @@ instance (System m (Run constraints sys), AllSystems m rest) => AllSystems m (Ru
107109instance {-# OVERLAPPABLE #-} (System m sys , AllSystems m rest ) => AllSystems m (sys ': rest )
108110
109111class CompileGroups m (groups :: [[Type ]]) (systems :: [Type ]) where
110- compileGroups :: HSetT ( IdentityT m ) systems -> HSetT ( HSetT ( IdentityT m )) groups
112+ compileGroups :: HSet systems -> HSet ( GroupsToNestedHSet m groups )
111113
112114instance CompileGroups m '[] systems where
113115 compileGroups _ = HEmpty
@@ -123,23 +125,27 @@ instance
123125 HCons (compileGroup @ m @ group @ systems systems) (compileGroups @ m @ rest @ systems systems)
124126
125127class CompileGroup m (group :: [Type ]) (systems :: [Type ]) where
126- compileGroup :: HSetT (IdentityT m ) systems -> HSetT (IdentityT m ) group
128+ compileGroup :: HSet systems -> HSet (MapToIdentityT m group )
129+
130+ type family MapToIdentityT m (systems :: [Type ]) :: [Type ] where
131+ MapToIdentityT m '[] = '[]
132+ MapToIdentityT m (sys ': rest ) = sys ': MapToIdentityT m rest
127133
128134instance CompileGroup m '[] systems where
129135 compileGroup _ = HEmpty
130136
131137instance (ExtractSystem m sys systems ) => CompileGroup m '[sys ] systems where
132- compileGroup systems = HCons (extractSystem @ m @ sys @ systems systems) HEmpty
138+ compileGroup systems = HCons (( extractSystem @ m @ sys @ systems systems) ) HEmpty
133139
134140instance
135141 (ExtractSystem m sys systems , CompileGroup m rest systems ) =>
136142 CompileGroup m (sys ': rest ) systems
137143 where
138144 compileGroup systems =
139- HCons (extractSystem @ m @ sys @ systems systems) (compileGroup @ m @ rest @ systems systems)
145+ HCons (( extractSystem @ m @ sys @ systems systems) ) (compileGroup @ m @ rest @ systems systems)
140146
141147class ExtractSystem m (sys :: Type ) (systems :: [Type ]) where
142- extractSystem :: HSetT ( IdentityT m ) systems -> IdentityT m sys
148+ extractSystem :: HSet systems -> sys
143149
144150instance ExtractSystem m sys (sys ': rest ) where
145151 extractSystem (HCons sys _) = sys
0 commit comments