fixplate-0.1.1: Data/Generics/Fixplate/Misc.hs
-- | Miscellaneous utility functions
module Data.Generics.Fixplate.Misc where
--------------------------------------------------------------------------------
import Data.Traversable
--------------------------------------------------------------------------------
data Two a b
= Empty
| One a
| Two b
deriving Show
data Both a b
= None
| First a
| Both a b
deriving Show
--------------------------------------------------------------------------------
unsafe :: (a -> Maybe b) -> String -> a -> b
unsafe safe msg loc = case safe loc of
Just new -> new
Nothing -> error msg
--------------------------------------------------------------------------------
app_prec :: Int
app_prec = 10
--------------------------------------------------------------------------------
(<#>) :: (a -> b) -> (c -> d) -> (a,c) -> (b,d)
(f <#> g) (x,y) = (f x, g y)
--------------------------------------------------------------------------------
tillNothing :: (a -> Maybe a) -> a -> a
tillNothing f = go where
go x = case f x of { Nothing -> x ; Just y -> go y }
chain :: [a -> Maybe a] -> a -> Maybe a
chain [] x = return x
chain (f:fs) x = (f x) >>= chain fs
chainJust :: [a -> Maybe a] -> a -> a
chainJust fs x = case chain fs x of
Nothing -> error "chainJust: Nothing"
Just y -> y
--------------------------------------------------------------------------------
iterateN :: Int -> (a -> a) -> a -> a
iterateN n f = go n where
go 0 x = x
go n x = go (n-1) (f x)
--------------------------------------------------------------------------------