module Mischief.ECS.Utils where

import Data.Data
import Data.Foldable
import Data.Kind
import Data.Maybe
import GHC.Stack

class GetRep t where
  getRep :: t -> TypeRep

findM :: forall (m :: Type -> Type) a t. (Monad m, Foldable t) => (a -> m Bool) -> t a -> m (Maybe a)
findM :: forall (m :: * -> *) a (t :: * -> *).
(Monad m, Foldable t) =>
(a -> m Bool) -> t a -> m (Maybe a)
findM a -> m Bool
f t a
l = (a -> m Bool) -> [a] -> m (Maybe a)
forall {f :: * -> *} {a}.
Monad f =>
(a -> f Bool) -> [a] -> f (Maybe a)
f' a -> m Bool
f (t a -> [a]
forall a. t a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList t a
l)
  where
    f' :: (a -> f Bool) -> [a] -> f (Maybe a)
f' a -> f Bool
_ [] = Maybe a -> f (Maybe a)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
forall a. Maybe a
Nothing
    f' a -> f Bool
f (a
x : [a]
xs) = do
      b <- a -> f Bool
f a
x
      if b
        then
          pure $ Just x
        else
          findM f xs

unwrap :: (HasCallStack) => Maybe a -> a
unwrap :: forall a. HasCallStack => Maybe a -> a
unwrap = (HasCallStack => Maybe a -> a) -> Maybe a -> a
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack ((HasCallStack => Maybe a -> a) -> Maybe a -> a)
-> (HasCallStack => Maybe a -> a) -> Maybe a -> a
forall a b. (a -> b) -> a -> b
$ a -> Maybe a -> a
forall a. a -> Maybe a -> a
fromMaybe a
forall a. HasCallStack => a
undefined

(>>+) :: forall (m :: Type -> Type) a b. (Monad m) => m a -> (a -> m b) -> m a
>>+ :: forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m a
(>>+) m a
a a -> m b
f = m a
a m a -> (a -> m b) -> m b
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= a -> m b
f m b -> (b -> m a) -> m a
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= m a -> b -> m a
forall a b. a -> b -> a
const m a
a