futhark-0.21.7: An optimising compiler for a functional, array-oriented language.
Safe HaskellTrustworthy
LanguageHaskell2010

Futhark.Util

Description

Non-Futhark-specific utilities. If you find yourself writing general functions on generic data structures, consider putting them here.

Sometimes it is also preferable to copy a small function rather than introducing a large dependency. In this case, make sure to note where you got it from (and make sure that the license is compatible).

Synopsis

Documentation

nubOrd :: Ord a => [a] -> [a] Source #

Like nub, but without the quadratic runtime.

nubByOrd :: (a -> a -> Ordering) -> [a] -> [a] Source #

Like nubBy, but without the quadratic runtime.

mapAccumLM :: Monad m => (acc -> x -> m (acc, y)) -> acc -> [x] -> m (acc, [y]) Source #

Like mapAccumL, but monadic.

maxinum :: (Num a, Ord a, Foldable f) => f a -> a Source #

Like maximum, but returns zero for an empty list.

chunk :: Int -> [a] -> [[a]] Source #

chunk n a splits a into n-size-chunks. If the length of a is not divisible by n, the last chunk will have fewer than n elements (but it will never be empty).

chunks :: [Int] -> [a] -> [[a]] Source #

chunks ns a splits a into chunks determined by the elements of ns. It must hold that sum ns == length a, or the resulting list may contain too few chunks, or not all elements of a.

dropAt :: Int -> Int -> [a] -> [a] Source #

dropAt i n drops n elements starting at element i.

takeLast :: Int -> [a] -> [a] Source #

takeLast n l takes the last n elements of l.

dropLast :: Int -> [a] -> [a] Source #

dropLast n l drops the last n elements of l.

mapEither :: (a -> Either b c) -> [a] -> ([b], [c]) Source #

A combination of map and partitionEithers.

maybeNth :: Integral int => int -> [a] -> Maybe a Source #

Return the list element at the given index, if the index is valid.

maybeHead :: [a] -> Maybe a Source #

Return the first element of the list, if it exists.

splitFromEnd :: Int -> [a] -> ([a], [a]) Source #

Like splitAt, but from the end.

splitAt3 :: Int -> Int -> [a] -> ([a], [a], [a]) Source #

Like splitAt, but produces three lists.

focusNth :: Integral int => int -> [a] -> Maybe ([a], a, [a]) Source #

Return the list element at the given index, if the index is valid, along with the elements before and after.

hashText :: Text -> Text Source #

Compute a hash of a text that is stable across OS versions. Returns the hash as a text as well, ready for human consumption.

unixEnvironment :: [(String, String)] Source #

The Unix environment when the Futhark compiler started.

isEnvVarAtLeast :: String -> Int -> Bool Source #

True if the environment variable, viewed as an integer, has at least this numeric value. Returns False if variable is unset or not numeric.

startupTime :: UTCTime Source #

The time at which the process started - or more accurately, the first time this binding was forced.

fancyTerminal :: Bool Source #

Are we running in a terminal capable of fancy commands and visualisation?

runProgramWithExitCode :: FilePath -> [String] -> ByteString -> IO (Either IOException (ExitCode, String, String)) Source #

Like readProcessWithExitCode, but also wraps exceptions when the indicated binary cannot be launched, or some other exception is thrown. Also does shenanigans to handle improperly encoded outputs.

directoryContents :: FilePath -> IO [FilePath] Source #

Every non-directory file contained in a directory tree.

roundFloat :: Float -> Float Source #

Round a single-precision floating point number correctly.

ceilFloat :: Float -> Float Source #

Round a single-precision floating point number upwards correctly.

floorFloat :: Float -> Float Source #

Round a single-precision floating point number downwards correctly.

roundDouble :: Double -> Double Source #

Round a double-precision floating point number correctly.

ceilDouble :: Double -> Double Source #

Round a double-precision floating point number upwards correctly.

floorDouble :: Double -> Double Source #

Round a double-precision floating point number downwards correctly.

lgamma :: Double -> Double Source #

The system-level lgamma() function.

lgammaf :: Float -> Float Source #

The system-level lgammaf() function.

tgamma :: Double -> Double Source #

The system-level tgamma() function.

tgammaf :: Float -> Float Source #

The system-level tgammaf() function.

hypot :: Double -> Double -> Double Source #

The system-level hypot function.

hypotf :: Float -> Float -> Float Source #

The system-level hypotf function.

fromPOSIX :: FilePath -> FilePath Source #

Some bad operating systems do not use forward slash as directory separator - this is where we convert Futhark includes (which always use forward slash) to native paths.

toPOSIX :: FilePath -> FilePath Source #

Turn a POSIX filepath into a filepath for the native system.

trim :: String -> String Source #

Remove leading and trailing whitespace from a string. Not an efficient implementation!

pmapIO :: Maybe Int -> (a -> IO b) -> [a] -> IO [b] Source #

Run various IO actions concurrently, possibly with a bound on the number of threads. The list must be finite. The ordering of the result list is not deterministic - add your own sorting if needed. If any of the actions throw an exception, then that exception is propagated to this function.

interactWithFileSafely :: IO a -> IO (Maybe (Either String a)) Source #

Do some operation on a file, returning Nothing if the file does not exist, and Left if some other error occurs.

readFileSafely :: FilePath -> IO (Maybe (Either String Text)) Source #

Read a file, returning Nothing if the file does not exist, and Left if some other error occurs.

convFloat :: (RealFloat from, RealFloat to) => from -> to Source #

Convert between different floating-point types, preserving infinities and NaNs.

type UserString = String Source #

As the user typed it.

type EncodedString = String Source #

Encoded form.

zEncodeString :: UserString -> EncodedString Source #

Z-encode a string using a slightly simplified variant of GHC Z-encoding. The encoded string is a valid identifier in most programming languages.

atMostChars :: Int -> String -> String Source #

Truncate to at most this many characters, making the last three characters "..." if truncation is necessary.

invertMap :: (Ord v, Ord k) => Map k v -> Map v (Set k) Source #

Invert a map, handling duplicate values (now keys) by constructing a set of corresponding values.

fixPoint :: Eq a => (a -> a) -> a -> a Source #

Perform fixpoint iteration.