packages feed

chitauri (empty) → 0.1.0.0

raw patch · 10 files changed

+264/−0 lines, 10 filesdep +basedep +chitauridep +digitssetup-changed

Dependencies added: base, chitauri, digits, either-unwrap, generic-trie, haskeline, parsec

Files

+ LICENSE view
@@ -0,0 +1,30 @@+Copyright Author name here (c) 2016++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++    * Redistributions of source code must retain the above copyright+      notice, this list of conditions and the following disclaimer.++    * Redistributions in binary form must reproduce the above+      copyright notice, this list of conditions and the following+      disclaimer in the documentation and/or other materials provided+      with the distribution.++    * Neither the name of Author name here nor the names of other+      contributors may be used to endorse or promote products derived+      from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ app/Main.hs view
@@ -0,0 +1,44 @@+module Main where++import Parser (parseDictionary, dictionary)+import PhoneticWord (PhoneticWord(..))+import PhoneticDictionary (PhoneticDictionary)++import qualified Data.GenericTrie as T+import qualified System.Console.Haskeline as H+import Data.Either.Unwrap (fromRight)+import Text.Read (readMaybe)+import Data.Char (digitToInt, isDigit)+import Data.Maybe (fromMaybe)++main :: IO ()+main = do+  dict <- dictionary+  let parsed = parseDictionary dict+  case parseDictionary dict of+    Left a -> print a+    Right a -> mainLoop a++mainLoop dict = H.runInputT H.defaultSettings loop+  where+    loop :: H.InputT IO ()+    loop = do+      minput <- H.getInputLine "> "+      case minput of+        Nothing -> return ()+        Just "quit" -> return ()+        Just input -> do+          H.outputStrLn . formatPhoneticWords . findWords dict $ stringToDigits input+          loop++stringToDigits :: String -> [Int]+stringToDigits = fmap digitToInt . filter isDigit++formatPhoneticWords :: [PhoneticWord] -> String+formatPhoneticWords pWords = unlines $ zipWith formatPhoneticWord pWords [0..]+  where+    formatPhoneticWord :: PhoneticWord -> Int -> String+    formatPhoneticWord pWord i = show i ++ ") " ++ word pWord ++findWords :: PhoneticDictionary -> [Int] -> [PhoneticWord]+findWords dict ds = fromMaybe [] $ T.lookup ds dict
+ chitauri.cabal view
@@ -0,0 +1,52 @@+name:                chitauri+version:             0.1.0.0+synopsis:            Initial project template from stack+description:         Please see README.md+homepage:            https://github.com/githubuser/chitauri#readme+license:             BSD3+license-file:        LICENSE+author:              Author name here+maintainer:          example@example.com+copyright:           2016 Author name here+category:            Web+build-type:          Simple+-- extra-source-files:+cabal-version:       >=1.10++library+  hs-source-dirs:      src+  exposed-modules:     Parser,+                       Phoneme,+                       PhoneticDictionary,+                       PhoneticWord,+                       MajorSystem+  build-depends:       base >= 4.7 && < 5,+                       parsec,+                       generic-trie,+                       either-unwrap+  default-language:    Haskell2010++executable chitauri+  hs-source-dirs:      app+  main-is:             Main.hs+  ghc-options:         -threaded -rtsopts -with-rtsopts=-N+  build-depends:       base,+                       chitauri,+                       either-unwrap,+                       generic-trie,+                       haskeline,+                       digits+  default-language:    Haskell2010++test-suite chitauri-test+  type:                exitcode-stdio-1.0+  hs-source-dirs:      test+  main-is:             Spec.hs+  build-depends:       base+                     , chitauri+  ghc-options:         -threaded -rtsopts -with-rtsopts=-N+  default-language:    Haskell2010++source-repository head+  type:     git+  location: https://github.com/githubuser/chitauri
+ src/MajorSystem.hs view
@@ -0,0 +1,27 @@+module MajorSystem where++import Phoneme++phonemeToNumber :: Phoneme -> Maybe Int+phonemeToNumber S  = Just 0+phonemeToNumber Z  = Just 0+phonemeToNumber D  = Just 1+phonemeToNumber T  = Just 1+phonemeToNumber TH = Just 1+phonemeToNumber N  = Just 2+phonemeToNumber M  = Just 3+phonemeToNumber ER = Just 4+phonemeToNumber R  = Just 4+phonemeToNumber L  = Just 5+phonemeToNumber CH = Just 6+phonemeToNumber JH = Just 6+phonemeToNumber SH = Just 6+phonemeToNumber ZH = Just 6+phonemeToNumber G  = Just 7+phonemeToNumber K  = Just 7+phonemeToNumber F  = Just 8+phonemeToNumber V  = Just 8+phonemeToNumber B  = Just 9+phonemeToNumber P  = Just 9+phonemeToNumber NG = Just 27+phonemeToNumber _  = Nothing
+ src/Parser.hs view
@@ -0,0 +1,47 @@+module Parser where++import Text.Parsec.Char (endOfLine)+import Text.ParserCombinators.Parsec.Char (anyChar, upper, digit)+import Text.Parsec (lookAhead, manyTill, skipMany, many, many1, oneOf, parse, char, sepBy, endBy, (<|>))+import Text.Parsec.Error (ParseError)+import Data.GenericTrie (fromListWith)+import Data.Maybe (catMaybes)+import Data.Char (toLower, toUpper)+import Data.List (sortBy)+import Data.Ord (compare)+import Data.Function (on)++import PhoneticDictionary (PhoneticDictionary)+import Phoneme (charsToPhoneme)+import PhoneticWord (PhoneticWord(..))+import MajorSystem(phonemeToNumber)++parseDictionary :: String -> Either ParseError PhoneticDictionary+parseDictionary dict = do+  let wordsOrError = parse parser "Failure" dict+  wordsToDictionary <$> wordsOrError++wordsToDictionary ws = fromListWith combineEntries $ fmap wordToTuple ws+  where+    wordToTuple pWord = (catMaybes $ phonemeToNumber <$> phonemes pWord, [pWord])+    combineEntries :: [PhoneticWord] -> [PhoneticWord] -> [PhoneticWord]+    combineEntries xs ys = sortBy (compare `on` (length . word)) $ xs ++ ys++dictionary :: IO String+dictionary = readFile "assets/dict.txt"++phonemesParser = many1 (char ' ') *> sepBy phonemeParser (char ' ') +phonemeParser = many1 upper <* skipMany digit+wordParser = garbageParser *> (fixCase <$> manyTill anyChar (lookAhead $ char ' '))+garbageParser = many $ oneOf "?!@#$%^&*().,'><\"+=-_][}{/':; " <|> digit++fixCase :: String -> String+fixCase (x:xs) = toUpper x : map toLower xs+fixCase [] = []++line = do+  w <- wordParser+  ps <- catMaybes . fmap charsToPhoneme <$> phonemesParser+  return PhoneticWord { word = w, phonemes = ps }++parser = endBy line endOfLine
+ src/Phoneme.hs view
@@ -0,0 +1,46 @@+module Phoneme (Phoneme(..), charsToPhoneme) where++data Phoneme = AA | AE | AH | AO | AW | AY | B | CH | D | DH | EH | ER | EY | F | G | HH | IH | IY | JH | K | L | M | N | NG | OW | OY | P | R | S | SH | T | TH | UH | UW | V | W | Y | Z | ZH+  deriving (Show)++charsToPhoneme :: String -> Maybe Phoneme+charsToPhoneme "AA" = Just AA+charsToPhoneme "AE" = Just AE+charsToPhoneme "AH" = Just AH+charsToPhoneme "AO" = Just AO+charsToPhoneme "AW" = Just AW+charsToPhoneme "AY" = Just AY+charsToPhoneme "B"  = Just B+charsToPhoneme "CH" = Just CH+charsToPhoneme "D"  = Just D+charsToPhoneme "DH" = Just DH+charsToPhoneme "EH" = Just EH+charsToPhoneme "ER" = Just ER+charsToPhoneme "EY" = Just EY+charsToPhoneme "F"  = Just F+charsToPhoneme "G"  = Just G+charsToPhoneme "HH" = Just HH+charsToPhoneme "IH" = Just IH+charsToPhoneme "IY" = Just IY+charsToPhoneme "JH" = Just JH+charsToPhoneme "K"  = Just K+charsToPhoneme "L"  = Just L+charsToPhoneme "M"  = Just M+charsToPhoneme "N"  = Just N+charsToPhoneme "NG" = Just NG+charsToPhoneme "OW" = Just OW+charsToPhoneme "OY" = Just OY+charsToPhoneme "P"  = Just P+charsToPhoneme "R"  = Just R+charsToPhoneme "S"  = Just S+charsToPhoneme "SH" = Just SH+charsToPhoneme "T"  = Just T+charsToPhoneme "TH" = Just TH+charsToPhoneme "UH" = Just UH+charsToPhoneme "UW" = Just UW+charsToPhoneme "V"  = Just V+charsToPhoneme "W"  = Just W+charsToPhoneme "Y"  = Just Y+charsToPhoneme "Z"  = Just Z+charsToPhoneme "ZH" = Just ZH+charsToPhoneme _    = Nothing
+ src/PhoneticDictionary.hs view
@@ -0,0 +1,7 @@+module PhoneticDictionary where++import Data.GenericTrie (Trie)++import PhoneticWord (PhoneticWord)++type PhoneticDictionary = Trie [Int] [PhoneticWord]
+ src/PhoneticWord.hs view
@@ -0,0 +1,7 @@+module PhoneticWord (PhoneticWord(..)) where++import Phoneme (Phoneme)++data PhoneticWord = PhoneticWord { word :: String+                                 , phonemes :: [Phoneme]+                                 } deriving (Show)
+ test/Spec.hs view
@@ -0,0 +1,2 @@+main :: IO ()+main = putStrLn "Test suite not yet implemented"