-- Tools.hs -- -- Author: Yoshikuni Jujo -- module Hidden.Tools ( isSymbol , modifyFst , modifySnd , first , modifyFirst , guardEqual ) where import Control.Monad.State( StateT(StateT, runStateT), lift, MonadTrans ) import Data.Char ( isAlphaNum, isSpace, isPrint ) import Control.Monad ( MonadPlus, guard ) isSymbol :: Char -> Bool isSymbol = (not . isAlphaNum) &&& (not . isSpace) &&& isPrint (&&&) :: (a -> Bool) -> (a -> Bool) -> a -> Bool (p1 &&& p2) x = p1 x && p2 x modifyFst :: (a -> c) -> (a, b) -> (c, b) modifyFst f (x, y) = (f x, y) modifySnd :: (b -> c) -> (a, b) -> (a, c) modifySnd f (x, y) = (x, f y) guardEqual :: (MonadPlus m, Eq a) => m a -> m a -> m () guardEqual m1 m2 = do { x <- m1; y <- m2; guard (x == y) } first :: (a,b,c) -> a first (x,_,_) = x modifyFirst :: (a -> d) -> (a, b, c) -> (d, b, c) modifyFirst f (x, y, z) = (f x, y, z)