apecs-0.2.4.7: A fast ECS for game engine programming

Safe HaskellNone
LanguageHaskell2010

Apecs.Logs

Contents

Description

Experimental module for logging a store

Synopsis

Types and classes

class Log l c where #

A Log is a PureLog with mutable state.

Minimal complete definition

logEmpty, logOnSet, logOnDestroy, logReset

Methods

logEmpty :: IO (l c) #

logOnSet :: l c -> Entity a -> Maybe c -> c -> IO () #

logOnDestroy :: l c -> Entity a -> c -> IO () #

logReset :: l c -> IO () #

Instances

(Bounded c, Enum c) => Log EnumTable c # 

Methods

logEmpty :: IO (EnumTable c) #

logOnSet :: EnumTable c -> Entity a -> Maybe c -> c -> IO () #

logOnDestroy :: EnumTable c -> Entity a -> c -> IO () #

logReset :: EnumTable c -> IO () #

Log l c => Log (LVec1 l) c # 

Methods

logEmpty :: IO (LVec1 l c) #

logOnSet :: LVec1 l c -> Entity a -> Maybe c -> c -> IO () #

logOnDestroy :: LVec1 l c -> Entity a -> c -> IO () #

logReset :: LVec1 l c -> IO () #

PureLog l c => Log (FromPure l) c # 

Methods

logEmpty :: IO (FromPure l c) #

logOnSet :: FromPure l c -> Entity a -> Maybe c -> c -> IO () #

logOnDestroy :: FromPure l c -> Entity a -> c -> IO () #

logReset :: FromPure l c -> IO () #

(Log l1 c, Log l2 c) => Log (LVec2 l1 l2) c # 

Methods

logEmpty :: IO (LVec2 l1 l2 c) #

logOnSet :: LVec2 l1 l2 c -> Entity a -> Maybe c -> c -> IO () #

logOnDestroy :: LVec2 l1 l2 c -> Entity a -> c -> IO () #

logReset :: LVec2 l1 l2 c -> IO () #

(Log l1 c, Log l2 c, Log l3 c) => Log (LVec3 l1 l2 l3) c # 

Methods

logEmpty :: IO (LVec3 l1 l2 l3 c) #

logOnSet :: LVec3 l1 l2 l3 c -> Entity a -> Maybe c -> c -> IO () #

logOnDestroy :: LVec3 l1 l2 l3 c -> Entity a -> c -> IO () #

logReset :: LVec3 l1 l2 l3 c -> IO () #

class PureLog l c where #

A PureLog is a piece of state l c that is updated when components c are written or destroyed. Note that l :: * -> *

Minimal complete definition

pureEmpty, pureOnSet, pureOnDestroy

Methods

pureEmpty :: l c #

pureOnSet :: Entity a -> Maybe c -> c -> l c -> l c #

pureOnDestroy :: Entity a -> c -> l c -> l c #

newtype FromPure l c #

FromPure turns a PureLog into a Log

Constructors

FromPure (IORef (l c)) 

Instances

PureLog l c => Log (FromPure l) c # 

Methods

logEmpty :: IO (FromPure l c) #

logOnSet :: FromPure l c -> Entity a -> Maybe c -> c -> IO () #

logOnDestroy :: FromPure l c -> Entity a -> c -> IO () #

logReset :: FromPure l c -> IO () #

data Logger l s #

A Logger l of some store updates its Log l with the writes and deletes to store s

Instances

(Log l (Stores s), Cachable s) => Store (Logger l s) # 

Associated Types

type Stores (Logger l s) :: * #

type SafeRW (Logger l s) :: * #

Methods

initStore :: IO (Logger l s) #

explGet :: Logger l s -> Int -> IO (SafeRW (Logger l s)) #

explSet :: Logger l s -> Int -> Stores (Logger l s) -> IO () #

explDestroy :: Logger l s -> Int -> IO () #

explExists :: Logger l s -> Int -> IO Bool #

explMembers :: Logger l s -> IO (Vector Int) #

explGetUnsafe :: Logger l s -> Int -> IO (Stores (Logger l s)) #

explSetMaybe :: Logger l s -> Int -> SafeRW (Logger l s) -> IO () #

explReset :: Logger l s -> IO () #

explImapM_ :: MonadIO m => Logger l s -> (Int -> m a) -> m () #

explImapM :: MonadIO m => Logger l s -> (Int -> m a) -> m [a] #

explModify :: Logger l s -> Int -> (Stores (Logger l s) -> Stores (Logger l s)) -> IO () #

explCmap :: Logger l s -> (Stores (Logger l s) -> Stores (Logger l s)) -> IO () #

explCmapM_ :: MonadIO m => Logger l s -> (Stores (Logger l s) -> m a) -> m () #

explCimapM_ :: MonadIO m => Logger l s -> ((Int, Stores (Logger l s)) -> m a) -> m () #

explCmapM :: MonadIO m => Logger l s -> (Stores (Logger l s) -> m a) -> m [a] #

explCimapM :: MonadIO m => Logger l s -> ((Int, Stores (Logger l s)) -> m a) -> m [a] #

type Stores (Logger l s) # 
type Stores (Logger l s) = Stores s
type SafeRW (Logger l s) # 
type SafeRW (Logger l s) = SafeRW s

getLog :: forall w c l. (Store (Storage c), Has w c, HasLog (Storage c) l, Log l c) => System w (l c) #

Produces the log indicated by the return type.

readIORef :: IORef a -> IO a #

Read the value of an IORef

data LVec1 l c #

Composite Log consisting of 1 Log

Instances

Log l c => Log (LVec1 l) c # 

Methods

logEmpty :: IO (LVec1 l c) #

logOnSet :: LVec1 l c -> Entity a -> Maybe c -> c -> IO () #

logOnDestroy :: LVec1 l c -> Entity a -> c -> IO () #

logReset :: LVec1 l c -> IO () #

data LVec2 l1 l2 c #

Composite Log consisting of 2 Logs

Instances

(Log l1 c, Log l2 c) => Log (LVec2 l1 l2) c # 

Methods

logEmpty :: IO (LVec2 l1 l2 c) #

logOnSet :: LVec2 l1 l2 c -> Entity a -> Maybe c -> c -> IO () #

logOnDestroy :: LVec2 l1 l2 c -> Entity a -> c -> IO () #

logReset :: LVec2 l1 l2 c -> IO () #

data LVec3 l1 l2 l3 c #

Composite Log consisting of 3 Logs

Instances

(Log l1 c, Log l2 c, Log l3 c) => Log (LVec3 l1 l2 l3) c # 

Methods

logEmpty :: IO (LVec3 l1 l2 l3 c) #

logOnSet :: LVec3 l1 l2 l3 c -> Entity a -> Maybe c -> c -> IO () #

logOnDestroy :: LVec3 l1 l2 l3 c -> Entity a -> c -> IO () #

logReset :: LVec3 l1 l2 l3 c -> IO () #

EnumTable

data EnumTable c #

Hashtable that maintains buckets of entities whose fromEnum c produces the same value

Instances

(Bounded c, Enum c) => Log EnumTable c # 

Methods

logEmpty :: IO (EnumTable c) #

logOnSet :: EnumTable c -> Entity a -> Maybe c -> c -> IO () #

logOnDestroy :: EnumTable c -> Entity a -> c -> IO () #

logReset :: EnumTable c -> IO () #

byIndex :: EnumTable c -> Int -> System w (Slice c) #

Query the EnumTable by an index (the result of fromEnum). Will return an empty slice if index < 0 of index >= fromEnum (maxBound).

byEnum :: Enum c => EnumTable c -> c -> System w (Slice c) #

Query the EnumTable by an example enum. Will not perform bound checks, so crashes if `fromEnum c && fromEnum c fromEnum maxBound `.