{- | Some minor utility functions -}

module Util (
    boolToInt
  , safeHead
  , safeTail
  , findIndexes) where

-- | Return @True@ for @1@ and otherwise @False@
boolToInt :: Bool -> Int
boolToInt :: Bool -> Int
boolToInt Bool
True  = Int
1
boolToInt Bool
False = Int
0

-- | Safely attempt to return the head of a list
safeHead :: [a] -> Maybe a
safeHead :: forall a. [a] -> Maybe a
safeHead []     = Maybe a
forall a. Maybe a
Nothing
safeHead (a
x:[a]
xs) = a -> Maybe a
forall a. a -> Maybe a
Just a
x

-- | Return the tail of a list, behaving as the identity function upon an empty list
safeTail :: [a] -> [a]
safeTail :: forall a. [a] -> [a]
safeTail [] = []
safeTail (a
x:[a]
xs) = [a]
xs

-- | Return all the positions that a value occurs within a list
findIndexes :: Eq a => [a] -> a -> [Int]
findIndexes :: forall a. Eq a => [a] -> a -> [Int]
findIndexes [a]
xs a
a = [Int] -> [Int]
forall a. [a] -> [a]
reverse ([Int] -> [Int]) -> [Int] -> [Int]
forall a b. (a -> b) -> a -> b
$ [a] -> Int -> [Int] -> [Int]
forall {a}. Num a => [a] -> a -> [a] -> [a]
go [a]
xs Int
0 []
  where
  go :: [a] -> a -> [a] -> [a]
go (a
x:[a]
xs) a
i [a]
inds = if a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
a then [a] -> a -> [a] -> [a]
go [a]
xs (a
i a -> a -> a
forall a. Num a => a -> a -> a
+ a
1) (a
ia -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
inds)
                     else [a] -> a -> [a] -> [a]
go [a]
xs (a
i a -> a -> a
forall a. Num a => a -> a -> a
+ a
1) [a]
inds
  go [] a
i [a]
inds = [a]
inds