Safe Haskell | Safe-Infered |
---|
This module provides some very generic, non-GenI specific functions on strings, trees and other miscellaneous odds and ends. Whenever possible, one should try to replace these functions with versions that are available in the standard libraries, or the Haskell platform ones, or on hackage.
- ePutStr :: String -> IO ()
- ePutStrLn :: String -> IO ()
- eFlush :: IO ()
- isGeniIdentLetter :: Char -> Bool
- dropTillIncluding :: Char -> String -> String
- trim :: String -> String
- toUpperHead :: String -> String
- toLowerHead :: String -> String
- toAlphaNum :: String -> [AlphaNum]
- quoteString :: String -> String
- quoteText :: Text -> Text
- maybeQuoteText :: Text -> Text
- clumpBy :: (a -> Int) -> Int -> [a] -> [[a]]
- first3 :: (a -> a2) -> (a, b, c) -> (a2, b, c)
- second3 :: (b -> b2) -> (a, b, c) -> (a, b2, c)
- third3 :: (c -> c2) -> (a, b, c) -> (a, b, c2)
- fst3 :: (a, b, c) -> a
- snd3 :: (a, b, c) -> b
- thd3 :: (a, b, c) -> c
- map' :: (a -> b) -> [a] -> [b]
- buckets :: Ord b => (a -> b) -> [a] -> [(b, [a])]
- isEmptyIntersect :: Eq a => [a] -> [a] -> Bool
- groupByFM :: Ord b => (a -> b) -> [a] -> Map b [a]
- insertToListMap :: Ord b => b -> a -> Map b [a] -> Map b [a]
- histogram :: Ord a => [a] -> Map a Int
- combinations :: [[a]] -> [[a]]
- mapMaybeM :: Monad m => (a -> m (Maybe b)) -> [a] -> m [b]
- repList :: (a -> Bool) -> (a -> a) -> [a] -> [a]
- mapTree' :: (a -> b) -> Tree a -> Tree b
- filterTree :: (a -> Bool) -> Tree a -> [a]
- treeLeaves :: Tree a -> [a]
- preTerminals :: Tree a -> [(a, a)]
- repNode :: (Tree a -> Tree a) -> (Tree a -> Bool) -> Tree a -> Maybe (Tree a)
- repAllNode :: (Tree a -> Tree a) -> (Tree a -> Bool) -> Tree a -> Tree a
- listRepNode :: (Tree a -> Tree a) -> (Tree a -> Bool) -> [Tree a] -> ([Tree a], Bool)
- repNodeByNode :: (a -> Bool) -> a -> Tree a -> Tree a
- type Interval = (Int, Int)
- (!+!) :: Interval -> Interval -> Interval
- ival :: Int -> Interval
- showInterval :: Interval -> String
- type BitVector = Integer
- showBitVector :: Int -> BitVector -> String
- geniBug :: String -> a
- prettyException :: IOException -> String
- mkLogname :: Typeable a => a -> String
IO
Strings
isGeniIdentLetter :: Char -> Bool
dropTillIncluding :: Char -> String -> String
Drop all characters up to and including the one in question
toUpperHead :: String -> String
Make the first character of a string upper case
toLowerHead :: String -> String
Make the first character of a string lower case
toAlphaNum :: String -> [AlphaNum]
An alphanumeric sort is one where you treat the numbers in the string as actual numbers. An alphanumeric sort would put x2 before x100, because 2 < 10, wheraeas a naive sort would put it the other way around because the characters 1 < 2. To sort alphanumerically, just 'sortBy (comparing toAlphaNum)'
quoteString :: String -> String
maybeQuoteText :: Text -> Text
quoteText
but only if it contains characters that are not
used in GenI identifiers
clumpBy :: (a -> Int) -> Int -> [a] -> [[a]]
break a list of items into sublists of length < the clump size, taking into consideration that each item in the clump will have a single gap of padding interspersed
any item whose length is greater than the clump size is put into a clump by itself
given a length function
clumpBy (length.show) 8 [hello, this, is, a, list]
Triples
first3 :: (a -> a2) -> (a, b, c) -> (a2, b, c)
second3 :: (b -> b2) -> (a, b, c) -> (a, b2, c)
third3 :: (c -> c2) -> (a, b, c) -> (a, b, c2)
fst3 :: (a, b, c) -> a
snd3 :: (a, b, c) -> b
thd3 :: (a, b, c) -> c
Lists
isEmptyIntersect :: Eq a => [a] -> [a] -> Bool
True if the intersection of two lists is empty.
groupByFM :: Ord b => (a -> b) -> [a] -> Map b [a]
Serves the same function as groupBy
. It groups together
items by some property they have in common. The difference is that the
property is used as a key to a Map that you can lookup.
insertToListMap :: Ord b => b -> a -> Map b [a] -> Map b [a]
combinations :: [[a]] -> [[a]]
repList :: (a -> Bool) -> (a -> a) -> [a] -> [a]
Return the list, modifying only the first matching item.
Trees
filterTree :: (a -> Bool) -> Tree a -> [a]
Like filter
, except on Trees. Filter might not be a good name, though,
because we return a list of nodes, not a tree.
treeLeaves :: Tree a -> [a]
The leaf nodes of a Tree
preTerminals :: Tree a -> [(a, a)]
Return pairs of (parent, terminal)
:: (Tree a -> Tree a) | replacement function |
-> (Tree a -> Bool) | filtering function |
-> Tree a | |
-> Maybe (Tree a) |
repNode
fn filt t
returns a version of t
in which the first
node which filt
matches is transformed using fn
.
repAllNode :: (Tree a -> Tree a) -> (Tree a -> Bool) -> Tree a -> Tree a
Like repNode
except that it performs the operations on
all nodes that match and doesn't care if any nodes match
or not
:: (Tree a -> Tree a) | replacement function |
-> (Tree a -> Bool) | filtering function |
-> [Tree a] | nodes |
-> ([Tree a], Bool) |
Like repNode
but on a list of tree nodes
Replace a node in the tree in-place with another node; keep the children the same. If the node is not found in the tree, or if there are multiple instances of the node, this is treated as an error.
Intervals
showInterval :: Interval -> String
Bit vectors
showBitVector :: Int -> BitVector -> String
displays a bit vector, using a minimum number of bits
Errors, logging and exceptions
prettyException :: IOException -> String