packages feed

palindromes-0.2: src/Data/Algorithms/Palindromes/Options.hs

-----------------------------------------------------------------------------
-- |
-- Module      :  Data.Algorithms.Palindromes.Options
-- Copyright   :  (c) 2007 - 2010 Johan Jeuring
-- License     :  BSD3
--
-- Maintainer  :  johan@jeuring.net
-- Stability   :  experimental
-- Portability :  portable
--
-----------------------------------------------------------------------------
module Data.Algorithms.Palindromes.Options where

import System.Console.GetOpt 

import Data.Algorithms.Palindromes.Palindromes

-----------------------------------------------------------------------------
-- flags
-----------------------------------------------------------------------------

data Flag  =  Help
           |  StandardInput
           |  LongestPalindrome
           |  LongestPalindromes
           |  LengthLongestPalindrome
           |  LengthLongestPalindromes
           |  LongestTextPalindrome
           |  LongestTextPalindromes
           |  LongestWordPalindrome
           |  LongestWordPalindromes
           |  LengthAtLeast Int deriving Show
          

isHelp :: Flag -> Bool
isHelp Help  =  True
isHelp _     =  False      

isStandardInput :: Flag -> Bool
isStandardInput StandardInput  =  True
isStandardInput _              =  False      

isLengthAtLeast :: Flag -> Bool
isLengthAtLeast (LengthAtLeast _)  =  True
isLengthAtLeast _                  =  False      

getLength :: Flag -> Int
getLength (LengthAtLeast n)  =  n 
getLength _                  =  error "No length specified"

-- I am using single letter options here (except for help): getOpt handles 
-- options too flexible: in case a letter within a multiple letter option is 
-- recognized, it is taken as a single letter option.
options :: [OptDescr Flag] 
options = 
  [Option "h" ["help"] (NoArg Help)
     "This message"
  ,Option "i" [] (NoArg StandardInput)
     "Read input from standard input"
  ,Option "o" [] (NoArg LongestPalindrome) 
     "Longest palindrome (default)"
  ,Option "p" [] (NoArg LongestPalindromes)
     "Longest palindrome around each position in the input"
  ,Option "k" [] (NoArg LengthLongestPalindrome)
     "Length of the longest palindrome"
  ,Option "l" [] (NoArg LengthLongestPalindromes)
     "Length of the longest palindrome around each position in the input"
  ,Option "s" [] (NoArg LongestTextPalindrome)
     "Longest palindrome ignoring case, spacing and punctuation"
  ,Option "t" [] (NoArg LongestTextPalindromes)
     "Longest text palindrome around each position in the input"
  ,Option "v" [] (NoArg LongestWordPalindrome)
     "Longest text palindrome preceded and followed by punctuation symbols (if any)"
  ,Option "w" [] (NoArg LongestWordPalindromes)
     "Longest word palindrome around each position in the input"
  ,Option "m" [] (ReqArg (LengthAtLeast . (read :: String -> Int)) "arg")
     "Palindromes of length at least [arg]"
  ]

handleOptions :: [Flag] -> (String -> String,Bool)
handleOptions flags = 
  let lal     =  filter isLengthAtLeast flags
      flags'  =  filter (\f -> not (isLengthAtLeast f || isStandardInput f)) flags
      m       =  if null lal 
                 then 0
                 else getLength (head lal) 
      fromfile = null $ filter isStandardInput flags 
      function = case flags' of
                   []        -> longestPalindrome
                   (flag:_)  -> 
                     case flag of 
                       Help                      ->  
                         const (usageInfo headerHelpMessage options)
                       LongestPalindrome         ->  longestPalindrome 
                       LongestPalindromes        ->  longestPalindromes m
                       LengthLongestPalindrome   ->  lengthLongestPalindrome 
                       LengthLongestPalindromes  ->  lengthLongestPalindromes
                       LongestTextPalindrome     ->  longestTextPalindrome 
                       LongestTextPalindromes    ->  longestTextPalindromes m
                       LongestWordPalindrome     ->  longestWordPalindrome		
                       LongestWordPalindromes    ->  longestWordPalindromes m		
                       _                         ->  error "handleOptions"
  in (function,fromfile)

headerHelpMessage :: String
headerHelpMessage = 
     "*********************\n"
  ++ "* Palindrome Finder *\n"
  ++ "*********************\n"
  ++ "Usage:"