module Language.KansasLava.Internal where
import Data.Maybe as Maybe
import Language.KansasLava.Stream as Stream
import Prelude hiding (tail, lookup)
takeMaybe :: Maybe Int -> [a] -> [a]
takeMaybe = maybe id take
mergeWith :: (a -> a -> a) -> [[a]] -> [a]
mergeWith _ [] = []
mergeWith f ls = foldr1 (Prelude.zipWith f) ls
splitLists :: [[a]] -> [Int] -> [[[a]]]
splitLists xs (i:is) = map (take i) xs : splitLists (map (drop i) xs) is
splitLists _ [] = [[]]
class Stepify a where
stepify :: a -> a
stepifyStream :: (a -> ()) -> Stream a -> Stream a
stepifyStream f (Cons a opt_r) = Cons a (f a `seq` case opt_r of
Nothing -> Nothing
Just r -> Just $! stepifyStream f r)
data Radix a
= Res !a
| NoRes
| Choose !(Radix a) !(Radix a)
deriving Show
empty :: Radix a
empty = NoRes
insert :: [Bool] -> a -> Radix a -> Radix a
insert [] y (Res _) = Res $! y
insert [] y NoRes = Res $! y
insert [] _ (Choose _ _) = error "inserting with short key"
insert xs y NoRes = insert xs y (Choose NoRes NoRes)
insert _ _ (Res _) = error "inserting with too long a key"
insert (True:a) y (Choose l r) = Choose (insert a y l) r
insert (False:a) y (Choose l r) = Choose l (insert a y r)
find :: [Bool] -> Radix a -> Maybe a
find [] (Res v) = Just v
find [] NoRes = Nothing
find [] _ = error "find error with short key"
find (_:_) (Res _) = error "find error with long key"
find (_:_) NoRes = Nothing
find (True:a) (Choose l _) = find a l
find (False:a) (Choose _ r) = find a r