syntactic-1.2: src/Language/Syntactic/Sharing/Utils.hs
-- | Some utility functions used by the other modules
module Language.Syntactic.Sharing.Utils where
import Data.Array
import Data.List
--------------------------------------------------------------------------------
-- * Difference lists
--------------------------------------------------------------------------------
-- | Difference list
type DList a = [a] -> [a]
-- | Empty list
empty :: DList a
empty = id
-- | Singleton list
single :: a -> DList a
single = (:)
fromDList :: DList a -> [a]
fromDList = ($ [])
--------------------------------------------------------------------------------
-- * Misc.
--------------------------------------------------------------------------------
-- | Given a list @is@ of unique natural numbers, returns a function that maps
-- each number in @is@ to a unique number in the range @[0 .. length is-1]@. The
-- complexity is O(@maximum is@).
reindex :: (Integral a, Ix a) => [a] -> a -> a
reindex is = (tab!)
where
tab = array (0, maximum is) $ zip is [0..]
-- | Count the number of occurrences of each element in the list. The result is
-- an array mapping each element to its number of occurrences.
count :: Ix a
=> (a,a) -- ^ Upper and lower bound on the elements to be counted
-> [a] -- ^ Elements to be counted
-> Array a Int
count bnds as = accumArray (+) 0 bnds [(n,1) | n <- as]
-- | Partitions the list such that two elements are in the same sub-list if and
-- only if they satisfy the equivalence check. The complexity is O(n^2).
fullPartition :: (a -> a -> Bool) -> [a] -> [[a]]
fullPartition eq [] = []
fullPartition eq (a:as) = (a:as1) : fullPartition eq as2
where
(as1,as2) = partition (eq a) as