Declaratieve Talen/Oplossing haskell paginering

Ga naar: navigatie, zoeken
lru::Int->Int->[Int]->[(Int,Int,Int,Int)]
lru m n p=(lru2 m n p 1 [] [])

lru2::Int->Int->[Int]->Int->[Int]->[Int]->[(Int,Int,Int,Int)]
lru2 _ _ [] _ _ _=[]
lru2 m n (p:rest) tijd werk times= (if ((length werk)<m && notElem p werk) then lru2 m n rest (tijd+1) (werk++[p]) (times++[tijd])
								           else (if elem p werk then lru2 m n rest (tijd+1) werk (change_time werk p times tijd)
								     				else [(tijd,(index (minim times) times),werk!!(index (minim times) times),p)]++lru2 m n rest (tijd+1) (change_werk werk p (index (minim times) times)) (change_time (change_werk werk p (index (minim times) times)) p times tijd)))

change_time::[Int]->Int->[Int]->Int->[Int]
change_time werk p times tijd=take (index p werk) times++[tijd]++drop ((index p werk)+1) times 

change_werk::[Int]->Int->Int->[Int]
change_werk werk p ind=take ind werk++[p]++drop (ind+1) werk
 

index::Int->[Int]->Int
index _ []=error "not in list"
index p (el:rest)=(if p==el then 0
			    else (1+index p rest))

minim :: (Ord a) => [a] -> a
minim []       =  error "empty list"
minim xs       =  foldl1 min xs