packages feed

data-structure-inferrer-1.0: Recommend.hs

-- | Module for recommending a data structure based on operations used
module Recommend
  ( recommendDS,
    recommendAllDs ) where

import Defs.Structures

import AllStructures

import Data.List
import System.Random

-- | Recommends a data structure which is best for given operations @opns@. If there's more than one optimal structure, it chooses one at random
recommendDS :: [OperationName] -> IO Structure
recommendDS opns =  do
    let sorted = reverse $ sortBy (\x y-> compareDS x y opns) allStructures
    let bestStructures = head $ groupBy (\x y -> compareDS x y opns == EQ) sorted
    ridx <- randomRIO (0, length bestStructures - 1)
    return $ bestStructures !! ridx

-- | Recommends all optimal data structures for given operations @opns@
recommendAllDs :: [OperationName] -> [Structure]
recommendAllDs opns = recommendAllDsFromList opns allStructures

-- | Recommends the best possible data structure from @structs@ for given operations @opns@
recommendAllDsFromList :: [OperationName] -> [Structure] -> [Structure]
recommendAllDsFromList opns structs = let
     sorted = reverse $ sortBy (\x y-> compareDS x y opns) structs
     in head $ groupBy (\x y -> compareDS x y opns == EQ) sorted