{-
-}
--dfs edges open closed
dfs:: [(Int, Int)]->[Int]->[Int]->[Int]
dfs _ [] _ = []
dfs edges (a:rest) closed =
            if (elem a rest) then
                        (dfs edges ((nb a edges closed')++rest) closed')
            else
                a:(dfs edges ((nb a edges closed')++rest) closed')
       where
               closed'=[a]++closed
nb _ [] _ = []
nb a ((x,y):xs) closed
	| a==x && not(elem y closed)= y: nb a xs closed
	| a==y && not(elem x closed)= x: nb a xs closed
	|otherwise = nb a xs closed
{-
Prohledavani grafu do sirky
-}
--bfs edges open closed
bfs:: [(Int, Int)]->[Int]->[Int]->[Int]
bfs _ [] _ = []
bfs edges (a:rest) closed =
            if (elem a rest) then
                        (bfs edges (rest++(nb a edges closed')) closed')
            else
                a:(bfs edges (rest++(nb a edges closed')) closed')
   where
               closed'=[a]++closed
{-
Nekonecne seznamy - jednicky, fibonacciho cisla, faktorial, mocniny dvou, mocniny n
-}
ones = 1:ones
fib = 1:1:addpairs (zip fib (tail fib))
     where
	addpairs []=[]
	addpairs ((a,b):x)=(a+b):addpairs x
fib' = 1:1:zipWith (+) fib' (tail fib')
fibn n = fib !! (n-1)
facts'         = 1 : zipWith (*) facts' [2..]
dvoj=1:map (*2) dvoj
mocniny n = [n^x| x<-[0..]]
moc n = iterate (*n) 1
-- iterate f x = x : iterate f (f x) -- je definovano v Prelude
{-
Prvocisla na ruzny zpusob
-}
-- Prime numbers: Erasthmovo sito
primes      :: Integral a => [a]
primes       = map head (iterate sieve [2..])
sieve (p:xs) = [ x | x<-xs, x `mod` p /= 0 ]
pr2 = si2 [2..]
si2 (a:xs) = a: si2 [ x | x<-xs, x `mod` a /= 0 ]
{-
Delitele, perfektni cisla tj. rovne souctu svych delitelu
-}
mfactors i = filter (\x -> i `mod` x == 0) [1..i]
-- Perfect numbers:
factors n    = [ i | i<-[1..n-1], n `mod` i == 0 ]
perfect n    = sum (factors n) == n
firstperfect = head perfects
perfects     = filter perfect [1..]
{-
Pascaluv trojuhelnik
-}
pascal :: [[Int]]
pascal  = iterate (\row -> zipWith (+) ([0]++row) (row++[0])) [1]
{-
Doplneni oddelovacu tisicu -carek- do prirozeneho cisla zapsaneho jako seznam cifer
-}
carky =reverse.dopln.reverse
dopln::String->String
dopln (a:b:c:d:rest)=a:b:c:',':dopln (d:rest)
dopln x=x
{-
Member pro vzestupne usporadany seznam - vsimnete si podminky Ord t na typ
-}
memberOrd :: Ord t => [t] -> t -> Bool
memberOrd (m:x) n
	| mStrom a rovnost stromu
-}
data Tree a = Leaf a | Branch (Tree a) (Tree a)
instance (Eq a)=>Eq (Tree a) where
	Leaf a == Leaf b = a==b
	(Branch l1 r1)==(Branch l2 r2) = (l1==l2) && (r1==r2)
	_      == _			= False
--