Skip to content

Commit 9aa2b91

Browse files
authored
refactor: remove f wrapper from HSet (#44)
1 parent 47b7596 commit 9aa2b91

8 files changed

Lines changed: 82 additions & 95 deletions

File tree

examples/Scheduler.hs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ module Main where
99
import Aztecs
1010
import qualified Aztecs.World as W
1111
import Control.Monad.IO.Class
12-
import Control.Monad.Identity
1312

1413
newtype Position = Position Int
1514
deriving (Show, Eq)
@@ -99,24 +98,23 @@ app ::
9998
Run '[] RenderSystem
10099
]
101100
app =
102-
hcons (Run MoveSystem)
103-
. hcons (Run PhysicsSystem)
104-
. hcons (Run CombatSystem)
105-
. hcons (Run RenderSystem)
106-
$ hempty
101+
HCons (Run MoveSystem) $
102+
HCons (Run PhysicsSystem) $
103+
HCons (Run CombatSystem) $
104+
HCons (Run RenderSystem) $
105+
HEmpty
107106

108107
appSmall ::
109-
HSetT
110-
Identity
108+
HSet
111109
'[ Run '[After PhysicsSystem] MoveSystem,
112110
Run '[] PhysicsSystem,
113111
Run '[] RenderSystem
114112
]
115113
appSmall =
116-
hcons (Run MoveSystem)
117-
. hcons (Run PhysicsSystem)
118-
. hcons (Run RenderSystem)
119-
$ hempty
114+
HCons (Run MoveSystem) $
115+
HCons (Run PhysicsSystem) $
116+
HCons (Run RenderSystem) $
117+
HEmpty
120118

121119
runSchedulerExample :: IO ()
122120
runSchedulerExample = do

src/Aztecs/ECS/Executor.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
module Aztecs.ECS.Executor where
1212

1313
import Aztecs.ECS.Access.Internal
14-
import Aztecs.ECS.HSet (HSet, HSetT (..), Subset)
14+
import Aztecs.ECS.HSet (HSet (..), Subset)
1515
import Aztecs.ECS.Queryable.Internal
1616
import Aztecs.ECS.System
1717
import Aztecs.World
@@ -56,7 +56,7 @@ instance
5656
) =>
5757
Execute' m (HSet (sys ': systems))
5858
where
59-
execute' (HCons (Identity system) rest) =
59+
execute' (HCons system rest) =
6060
( do
6161
inputs <- access
6262
runSystem system inputs
@@ -70,8 +70,9 @@ instance (Applicative m) => Execute m (HSet '[]) where
7070
execute _ = pure ()
7171

7272
instance
73+
{-# OVERLAPPABLE #-}
7374
( Monad m,
74-
Execute' m (Identity systems),
75+
Execute' m systems,
7576
Execute m (HSet schedule)
7677
) =>
7778
Execute m (HSet (systems ': schedule))

src/Aztecs/ECS/HSet.hs

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@
1212
{-# LANGUAGE UndecidableInstances #-}
1313

1414
module Aztecs.ECS.HSet
15-
( HSet,
16-
HSetT (..),
15+
( HSet (..),
1716
Run (..),
1817
UnwrapSystem,
1918
GetConstraints,
@@ -22,8 +21,6 @@ module Aztecs.ECS.HSet
2221
Lookup (..),
2322
AdjustM (..),
2423
Subset (..),
25-
hcons,
26-
hempty,
2724
)
2825
where
2926

@@ -34,11 +31,9 @@ import qualified Data.SparseSet.Strict.Mutable as MS
3431
import Data.Word
3532
import Prelude hiding (lookup)
3633

37-
type HSet = HSetT Identity
38-
39-
data HSetT f ts where
40-
HEmpty :: HSetT f '[]
41-
HCons :: f t -> HSetT f ts -> HSetT f (t ': ts)
34+
data HSet ts where
35+
HEmpty :: HSet '[]
36+
HCons :: t -> HSet ts -> HSet (t ': ts)
4237

4338
data Before (sys :: Type)
4439

@@ -58,27 +53,25 @@ type family GetConstraints (runSys :: Type) :: [Type] where
5853
instance (Show sys) => Show (Run constraints sys) where
5954
show (Run sys) = "Run " ++ show sys
6055

61-
instance (ShowHSet f ts) => Show (HSetT f ts) where
56+
instance (ShowHSet ts) => Show (HSet ts) where
6257
show = showHSet
6358

64-
class ShowHSet f ts where
65-
showHSet :: HSetT f ts -> String
59+
class ShowHSet ts where
60+
showHSet :: HSet ts -> String
6661

67-
instance ShowHSet f '[] where
62+
instance ShowHSet '[] where
6863
showHSet _ = "HEmpty"
6964

70-
instance (Show (f t), ShowHSet f ts) => ShowHSet f (t ': ts) where
65+
instance (Show t, ShowHSet ts) => ShowHSet (t ': ts) where
7166
showHSet (HCons x xs) = "HCons " ++ show x ++ " (" ++ showHSet xs ++ ")"
7267

73-
74-
7568
type family Elem (t :: k) (ts :: [k]) :: Bool where
7669
Elem t '[] = 'False
7770
Elem t (t ': xs) = 'True
7871
Elem t (_ ': xs) = Elem t xs
7972

8073
class Lookup (t :: Type) (ts :: [Type]) where
81-
lookup :: HSetT f ts -> f t
74+
lookup :: HSet ts -> t
8275

8376
instance {-# OVERLAPPING #-} Lookup t (t ': ts) where
8477
lookup (HCons x _) = x
@@ -88,35 +81,25 @@ instance {-# OVERLAPPABLE #-} (Lookup t ts) => Lookup t (u ': ts) where
8881
lookup (HCons _ xs) = lookup xs
8982
{-# INLINE lookup #-}
9083

91-
class AdjustM m f t ts where
92-
adjustM :: (f t -> m (f t)) -> HSetT f ts -> m (HSetT f ts)
84+
class AdjustM m t ts where
85+
adjustM :: (t-> m t) -> HSet ts -> m (HSet ts)
9386

94-
instance {-# OVERLAPPING #-} (Applicative m) => AdjustM m f t (t ': ts) where
87+
instance {-# OVERLAPPING #-} (Applicative m) => AdjustM m t (t ': ts) where
9588
adjustM f (HCons x xs) = HCons <$> f x <*> pure xs
9689
{-# INLINE adjustM #-}
9790

98-
instance {-# OVERLAPPABLE #-} (Functor m, AdjustM m f t ts) => AdjustM m f t (u ': ts) where
91+
instance {-# OVERLAPPABLE #-} (Functor m, AdjustM m t ts) => AdjustM m t (u ': ts) where
9992
adjustM f (HCons y xs) = HCons y <$> adjustM f xs
10093
{-# INLINE adjustM #-}
10194

10295
class Subset (subset :: [Type]) (superset :: [Type]) where
103-
subset :: HSetT f superset -> HSetT f subset
96+
subset :: HSet superset -> HSet subset
10497

10598
instance Subset '[] superset where
10699
subset _ = HEmpty
107100
{-# INLINE subset #-}
108101

109-
instance
110-
( Lookup t superset,
111-
Subset ts superset
112-
) =>
113-
Subset (t ': ts) superset
114-
where
102+
instance (Lookup t superset, Subset ts superset) => Subset (t ': ts) superset where
115103
subset hset = HCons (lookup hset) (subset @ts hset)
116104
{-# INLINE subset #-}
117105

118-
hcons :: (Applicative f) => t -> HSetT f ts -> HSetT f (t ': ts)
119-
hcons x = HCons (pure x)
120-
121-
hempty :: HSetT f '[]
122-
hempty = HEmpty

src/Aztecs/ECS/Schedule/Internal.hs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,9 @@
1515
module Aztecs.ECS.Schedule.Internal where
1616

1717
import Aztecs.ECS.Access.Internal
18-
import Aztecs.ECS.HSet (HSetT (..), Run)
18+
import Aztecs.ECS.HSet (HSet (..), Run)
1919
import Aztecs.ECS.Queryable.Internal
2020
import Aztecs.ECS.System
21-
import Control.Monad.Identity
2221
import Data.Kind
2322

2423
class 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

9092
instance
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

101103
class AllSystems m systems
@@ -107,7 +109,7 @@ instance (System m (Run constraints sys), AllSystems m rest) => AllSystems m (Ru
107109
instance {-# OVERLAPPABLE #-} (System m sys, AllSystems m rest) => AllSystems m (sys ': rest)
108110

109111
class 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

112114
instance 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

125127
class 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

128134
instance CompileGroup m '[] systems where
129135
compileGroup _ = HEmpty
130136

131137
instance (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

134140
instance
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

141147
class ExtractSystem m (sys :: Type) (systems :: [Type]) where
142-
extractSystem :: HSetT (IdentityT m) systems -> IdentityT m sys
148+
extractSystem :: HSet systems -> sys
143149

144150
instance ExtractSystem m sys (sys ': rest) where
145151
extractSystem (HCons sys _) = sys

src/Aztecs/ECS/Scheduler/Internal.hs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ instance
4444
type SchedulerInput m (HSet systems) = systems
4545
type
4646
SchedulerOutput m (HSet systems) =
47-
HSetT HSet (ScheduleLevels m (TopologicalSort (BuildSystemGraph systems)))
47+
HSet (LevelsToNestedHSet (ScheduleLevels m (TopologicalSort (BuildSystemGraph systems))))
4848

4949
buildSchedule = scheduleSystemLevels @m @(TopologicalSort (BuildSystemGraph systems))
5050

@@ -166,13 +166,17 @@ scheduleSystemLevels ::
166166
ScheduleLevelsBuilder m levels systems
167167
) =>
168168
HSet systems ->
169-
HSetT HSet (ScheduleLevels m levels)
169+
HSet (LevelsToNestedHSet (ScheduleLevels m levels))
170170
scheduleSystemLevels = buildScheduleLevels @m @levels @systems
171171

172+
type family LevelsToNestedHSet (levels :: [[Type]]) :: [Type] where
173+
LevelsToNestedHSet '[] = '[]
174+
LevelsToNestedHSet (level ': rest) = HSet level ': LevelsToNestedHSet rest
175+
172176
class ScheduleLevelsBuilder (m :: Type -> Type) (levels :: [[Type]]) (systems :: [Type]) where
173177
buildScheduleLevels ::
174178
HSet systems ->
175-
HSetT HSet (ScheduleLevels m levels)
179+
HSet (LevelsToNestedHSet (ScheduleLevels m levels))
176180

177181
instance ScheduleLevelsBuilder m '[] systems where
178182
buildScheduleLevels _ = HEmpty
@@ -222,7 +226,7 @@ instance
222226
SystemReorderer originalSystems (targetSys ': restTargets)
223227
where
224228
reorderSystems originalSystems =
225-
let (targetSys, remaining) = extractFromHSet @targetSys @originalSystems originalSystems
229+
let (Identity targetSys, remaining) = extractFromHSet @targetSys @originalSystems originalSystems
226230
rest = reorderSystems @(RemainingAfterExtract targetSys originalSystems) @restTargets remaining
227231
in HCons targetSys rest
228232

@@ -237,14 +241,14 @@ class ExtractFromHSet (targetSys :: Type) (systems :: [Type]) where
237241
(Identity targetSys, HSet (RemainingAfterExtract targetSys systems))
238242

239243
instance {-# OVERLAPPING #-} ExtractFromHSet sys (sys ': rest) where
240-
extractFromHSet (HCons sys rest) = (sys, rest)
244+
extractFromHSet (HCons sys rest) = (Identity sys, rest)
241245

242246
instance
243247
{-# OVERLAPPING #-}
244248
(RemainingAfterExtract sys (Run constraints sys ': rest) ~ rest) =>
245249
ExtractFromHSet sys (Run constraints sys ': rest)
246250
where
247-
extractFromHSet (HCons (Identity (Run sys)) rest) = (Identity sys, rest)
251+
extractFromHSet (HCons (Run sys) rest) = (Identity sys, rest)
248252

249253
instance
250254
( ExtractFromHSet targetSys rest,
@@ -257,15 +261,13 @@ instance
257261
let (target, remaining) = extractFromHSet @targetSys @rest rest
258262
in (target, HCons other remaining)
259263

260-
instance (Applicative m) => Execute m (HSetT HSet '[]) where
261-
execute HEmpty = pure ()
262-
263264
instance
265+
{-# OVERLAPPING #-}
264266
( Monad m,
265267
Execute' m (HSet level),
266-
Execute m (HSetT HSet restLevels)
268+
Execute m (HSet restLevels)
267269
) =>
268-
Execute m (HSetT HSet (level ': restLevels))
270+
Execute m (HSet (HSet level ': restLevels))
269271
where
270272
execute (HCons level restLevels) = do
271273
ExecutorT $ \run -> run $ execute' level

0 commit comments

Comments
 (0)