{-# OPTIONS -XRank2Types -XCPP -XScopedTypeVariables #-}
module BUtil where
import qualified Data.IntMap as IntMap
import Control.Monad
import System.IO.Unsafe
import Control.Exception
data Nat = S Nat | Z deriving (Eq)
instance Show Nat where
show = show . fromNat
instance Num Nat where
(+) = error "No operators defined for Nat"
(*) = error "No operators defined for Nat"
abs = error "No operators defined for Nat"
signum = error "No operators defined for Nat"
fromInteger n | n < 0 = error "Nat cannot be negative"
| n >= 0 = toNat n
toNat x = if x == 0 then
Z
else
S (toNat $ x-1)
fromNat Z = 0
fromNat (S x) = 1 + fromNat x
fromDistinctList = IntMap.fromList
gen_put_bias :: Bias
-> (forall a. [a] -> [a])
-> (Nat -> Nat -> Maybe Nat)
-> [a] -> [a]
-> Maybe [Maybe a]
gen_put_bias bias get sput s v =
do { let ls = length s
; let g = fromDistinctList (zip (bias ls) s)
; l' <- maybe (fail "...")
return
(sput (toNat ls) (toNat (length v)))
; let t = bias (fromNat l')
; let h = fromDistinctList (zip (get t) v)
; let h'= IntMap.union h g
; return (map (flip IntMap.lookup h') t) }
withDefaultBias put bias d s v =
do { s' <- put bias s v
; return (map (maybe d id) s') }
withDefault put d s v =
do { s' <- put s v
; return (map (maybe d id) s') }
gen_put_dbias :: Bias -> (forall a. [a] -> [a])
-> (Nat -> Nat -> Maybe Nat)
-> a -> [a] -> [a] -> Maybe [a]
gen_put_dbias bias get sput d s v =
do { s' <- gen_put_bias bias get sput s v
; return (map (maybe d id) s') }
castError :: a -> Maybe a
castError f = unsafePerformIO $
do { r <- try (evaluate f)
; case r of
#if __GLASGOW_HASKELL__ >= 610
Left (e::SomeException) -> return $ Nothing
#else
Left e -> return $ Nothing
#endif
Right r -> return $ Just $ r }
type Bias = Int -> [ Int ]
rear l = [ 0 .. l - 1 ]
front l = reverse [ 0 .. l - 1 ]
middle l = [1,3..l] ++ (reverse [2,4..l])
borders l = (reverse [1,3..l])++[2,4..l]