NB. Database examples from Programming Methodology Chapter

people =: ('howland' ; 'jack' ; 'computer science professor') ; ('clinton' ; 'bill' ; 'president usa') ; ('clinton' ; 'hillary' ; 'president usa') ; ('perot' ; 'ross' ; 'wanted to be president') ; < ('bush' ; 'george' ; 'used to be president') 

lookup =: monad define 
('name' ; 'database') =. y.
if. nullp database
  do. ''
  else. if. name match head head database
          do. head database
          else. lookup name ; < rest database
        end.
end.
)

lookup_all =: monad define 
('key' ; 'datalist') =. y.
  if. nullp datalist
    do. ''
    else. if. key match head head datalist
            do. (< rest head datalist) , lookup_all key ; < rest datalist
            else. lookup_all key ; < rest datalist
          end.
end.
)

add_data =: monad define 
('item_pair' ; 'datalist') =. y.
  (< item_pair) , datalist
)

remove_data =: monad define 
('key' ; 'datalist') =. y.
  if. nullp datalist
    do. ''
    else. if. key match head head datalist
            do. rest datalist
            else. (< head datalist) , remove_data key ; < rest datalist
          end.
end.
)

remove_all_data =: monad define 
('key' ; 'datalist') =. y.
  if. nullp datalist
    do. ''
    else. if. key match head head datalist
            do. remove_all_data key ; < rest datalist
            else. (< head datalist) , remove_all_data key ; < rest datalist
          end.
end.
)

people_lookup =: monad def 'lookup y. ; < people'

people_all_looker =: monad def 'lookup_all y. ; < people'

people_db =: ('konstam' ; 'patricia' ; 'newspaper writer') ; ('konstam' ; 'aaron' ; 'computer science professor') ; ('eggen' ; 'maury' ; 'computer science professor') ; ('howland' ; 'jack' ; 'computer science professor') ; ('howland' ; 'glynne' ; 'nail manufacturer') ; ('clinton' ; 'bill' ; 'president usa') ; ('clinton' ; 'hillary' ; 'first lady usa') ; ('perot' ; 'ross' ; 'wanted to be president') ; < ('bush' ; 'george' ; 'used to be president') 

people_db write_list 'people.db'

lookup_file =: monad define 
('key' ; 'filename') =. y.
lookup key ; < read_list filename
)

lookup_all_file =: monad define 
('key' ; 'filename') =. y.
lookup_all key ; < read_list filename
)

add_data_file =: monad define 
('item_pair' ; 'filename') =. y.
(add_data item_pair ; < read_list filename) write_list filename
)

people_file_looker =: monad def 'lookup_file y. ; ''people.db'''

