functor BASIC() = struct fun swap(x,y) = (y,x) (* lists *) fun length [] = 0 | length (_ :: t) = 1 + length t fun fold f e [] = e | fold f e (h :: t) = fold f (f e h) t (* lists as sets *) fun sing x = [x] fun filter p [] = [] | filter p (h :: t) = if p h then h :: filter p t else filter p t fun member [] _ = false | member (h :: t) x = (h = x) orelse member t x fun insert x [] = [x] | insert x (h :: t) = if x = h then h :: t else h :: (insert x t) fun delete x [] = [] | delete x (h :: t) = if x = h then delete x t else h :: (delete x t) (* lists as dictionaries *) exception Lookup fun lookup [] _ = raise Lookup | lookup ((k',e) :: t) k = if k = k' then e else lookup t k fun remove ((k,e)::t) k' = if k = k' then t else (k,e) :: remove t k' | remove [] _ = [] fun enter ((k,e),d) = (k,e) :: remove d k (* integer lists as priority queues *) fun enq _ x [] = [x]:int list | enq (op <) x (h :: t) = if h < x then h :: enq (op <) x t else if x < h then x :: h :: t else h :: t end;