packages feed

mischief-ecs-0.1.0.0: src/Mischief/ECS/Utils.hs

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 f l = f' f (toList l)
  where
    f' _ [] = pure Nothing
    f' f (x : xs) = do
      b <- f x
      if b
        then
          pure $ Just x
        else
          findM f xs

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

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