{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
module Aztecs.ECS.World.Storage.Dynamic
( DynamicStorage (..),
dynStorage,
singletonDyn,
fromAscVectorDyn,
toAscVectorDyn,
)
where
import qualified Aztecs.ECS.World.Storage as S
import Data.Dynamic
import Data.Maybe
import Data.Vector (Vector)
import qualified Data.Vector as V
data DynamicStorage = DynamicStorage
{
DynamicStorage -> Dynamic
storageDyn :: !Dynamic,
DynamicStorage -> Dynamic -> Dynamic
singletonDyn' :: !(Dynamic -> Dynamic),
DynamicStorage -> Dynamic -> Vector Dynamic
toAscVectorDyn' :: !(Dynamic -> Vector Dynamic),
DynamicStorage -> Vector Dynamic -> Dynamic
fromAscVectorDyn' :: !(Vector Dynamic -> Dynamic)
}
instance Show DynamicStorage where
show :: DynamicStorage -> String
show DynamicStorage
s = String
"DynamicStorage " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Dynamic -> String
forall a. Show a => a -> String
show (DynamicStorage -> Dynamic
storageDyn DynamicStorage
s)
dynStorage :: forall a s. (S.Storage a s) => s -> DynamicStorage
dynStorage :: forall a s. Storage a s => s -> DynamicStorage
dynStorage s
s =
DynamicStorage
{ storageDyn :: Dynamic
storageDyn = s -> Dynamic
forall a. Typeable a => a -> Dynamic
toDyn s
s,
singletonDyn' :: Dynamic -> Dynamic
singletonDyn' = s -> Dynamic
forall a. Typeable a => a -> Dynamic
toDyn (s -> Dynamic) -> (Dynamic -> s) -> Dynamic -> Dynamic
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a s. Storage a s => a -> s
S.singleton @a @s (a -> s) -> (Dynamic -> a) -> Dynamic -> s
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Maybe a -> a
forall a. a -> Maybe a -> a
fromMaybe (String -> a
forall a. HasCallStack => String -> a
error String
"TODO") (Maybe a -> a) -> (Dynamic -> Maybe a) -> Dynamic -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Dynamic -> Maybe a
forall a. Typeable a => Dynamic -> Maybe a
fromDynamic,
toAscVectorDyn' :: Dynamic -> Vector Dynamic
toAscVectorDyn' = \Dynamic
d -> (a -> Dynamic) -> Vector a -> Vector Dynamic
forall a b. (a -> b) -> Vector a -> Vector b
V.map a -> Dynamic
forall a. Typeable a => a -> Dynamic
toDyn (forall a s. Storage a s => s -> Vector a
S.toAscVector @a @s (s -> Maybe s -> s
forall a. a -> Maybe a -> a
fromMaybe (String -> s
forall a. HasCallStack => String -> a
error String
"TODO") (Maybe s -> s) -> Maybe s -> s
forall a b. (a -> b) -> a -> b
$ Dynamic -> Maybe s
forall a. Typeable a => Dynamic -> Maybe a
fromDynamic Dynamic
d)),
fromAscVectorDyn' :: Vector Dynamic -> Dynamic
fromAscVectorDyn' = s -> Dynamic
forall a. Typeable a => a -> Dynamic
toDyn (s -> Dynamic)
-> (Vector Dynamic -> s) -> Vector Dynamic -> Dynamic
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a s. Storage a s => Vector a -> s
S.fromAscVector @a @s (Vector a -> s)
-> (Vector Dynamic -> Vector a) -> Vector Dynamic -> s
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Dynamic -> a) -> Vector Dynamic -> Vector a
forall a b. (a -> b) -> Vector a -> Vector b
V.map (a -> Maybe a -> a
forall a. a -> Maybe a -> a
fromMaybe (String -> a
forall a. HasCallStack => String -> a
error String
"TODO") (Maybe a -> a) -> (Dynamic -> Maybe a) -> Dynamic -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Dynamic -> Maybe a
forall a. Typeable a => Dynamic -> Maybe a
fromDynamic)
}
{-# INLINE dynStorage #-}
singletonDyn :: Dynamic -> DynamicStorage -> DynamicStorage
singletonDyn :: Dynamic -> DynamicStorage -> DynamicStorage
singletonDyn Dynamic
dyn DynamicStorage
s = DynamicStorage
s {storageDyn = singletonDyn' s dyn}
fromAscVectorDyn :: Vector Dynamic -> DynamicStorage -> DynamicStorage
fromAscVectorDyn :: Vector Dynamic -> DynamicStorage -> DynamicStorage
fromAscVectorDyn Vector Dynamic
dyns DynamicStorage
s = DynamicStorage
s {storageDyn = fromAscVectorDyn' s dyns}
toAscVectorDyn :: DynamicStorage -> Vector Dynamic
toAscVectorDyn :: DynamicStorage -> Vector Dynamic
toAscVectorDyn = DynamicStorage -> Dynamic -> Vector Dynamic
toAscVectorDyn' (DynamicStorage -> Dynamic -> Vector Dynamic)
-> (DynamicStorage -> Dynamic) -> DynamicStorage -> Vector Dynamic
forall a b.
(DynamicStorage -> a -> b)
-> (DynamicStorage -> a) -> DynamicStorage -> b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> DynamicStorage -> Dynamic
storageDyn