packages feed

turncoat-1.0: src/AppPrelude.hs

module AppPrelude (module ClassyPrelude, module Data.Ord, Vector, (!!), (/), (%), inRange, maybeFilter, findTraverseIndex, untilM, elem, notElem) where

import           ClassyPrelude        hiding (Vector, elem, mask, notElem, (/), (>>), (^))

import           Data.Foldable        (elem, notElem)
import           Data.Int             (Int16)
import           Data.Ord
import           Data.Vector.Storable (Vector)


{-# SPECIALIZE (!!) :: Vector Int16 -> Int -> Int16 #-}
{-# SPECIALIZE (!!) :: Vector Word64 -> Int -> Word64 #-}
{-# INLINE (!!)  #-}
infixl 9 !!
(!!) :: Storable a => Vector a -> Int -> a
(!!) !x !y = unsafeIndex x y


{-# SPECIALIZE (/) :: Int16 -> Int16 -> Int16 #-}
{-# SPECIALIZE (/) :: Int -> Int -> Int #-}
{-# INLINE (/)  #-}
infixl 7 /
(/) :: Integral a => a -> a -> a
(/) !x !y = quot x y

{-# SPECIALIZE (%) :: Int16 -> Int16 -> Int16 #-}
{-# SPECIALIZE (%) :: Int -> Int -> Int #-}
{-# SPECIALIZE (%) :: Word64 -> Word64 -> Word64 #-}
{-# INLINE (%)  #-}
infixl 7 %
(%) :: Integral a => a -> a -> a
(%) !x !y = rem x y


inRange :: Int -> Int -> Int -> Bool
inRange lo hi x = lo <= x && x <= hi


{-# INLINE maybeFilter  #-}
maybeFilter :: (a -> Bool) -> Maybe a -> Maybe a
maybeFilter !predicate ma = do
  !a <- ma
  if predicate a
    then ma
    else Nothing


{-# INLINE findTraverseIndex  #-}
findTraverseIndex :: Monad m => (Int -> a -> m (Maybe b)) -> [a] -> m (Maybe b)
findTraverseIndex !f = go 0
  where
    go !i (!x : xs) = do
      result <- f i x
      maybe (go (i + 1) xs) (pure . Just) result
    go _ [] =
      pure Nothing


{-# INLINE untilM  #-}
untilM :: Monad m => (a -> m Bool) -> [a] -> m ()
untilM !f = go
  where
    go (!x : xs) = unlessM (f x) (go xs)
    go []        = pure ()