Joshua Moerman
8 years ago
commit
80b31d78d9
11 changed files with 274829 additions and 0 deletions
@ -0,0 +1,3 @@ |
|||
dist |
|||
*.o |
|||
*.hi |
@ -0,0 +1,24 @@ |
|||
-- Initial Applicative.cabal generated by cabal init. For further |
|||
-- documentation, see http://haskell.org/cabal/users-guide/ |
|||
|
|||
name: Applicative |
|||
version: 0.1.0.0 |
|||
-- synopsis: |
|||
-- description: |
|||
-- license: |
|||
license-file: LICENSE |
|||
author: Joshua Moerman |
|||
maintainer: lakseru@gmail.com |
|||
-- copyright: |
|||
-- category: |
|||
build-type: Simple |
|||
-- extra-source-files: |
|||
cabal-version: >=1.10 |
|||
|
|||
executable Applicative |
|||
main-is: Main.hs |
|||
-- other-modules: |
|||
-- other-extensions: |
|||
build-depends: base >=4.7 && <4.8, parsec, transformers, vector |
|||
-- hs-source-dirs: |
|||
default-language: Haskell2010 |
@ -0,0 +1,73 @@ |
|||
import Control.Applicative hiding (many, (<|>), optional) |
|||
import Data.ByteString (getContents) |
|||
import Data.Char (isAlphaNum, ord) |
|||
import Data.List |
|||
import Data.Maybe (catMaybes) |
|||
import Data.Monoid |
|||
import Prelude hiding (getContents) |
|||
import System.Environment (getArgs) |
|||
import Text.Parsec |
|||
import Text.Parsec.ByteString |
|||
import Text.Parsec.Char |
|||
import Text.Parsec.Combinator |
|||
import qualified Data.Attoparsec.ByteString as A |
|||
|
|||
data Transition s i o = Transition s i s o |
|||
deriving (Show, Read, Eq, Ord) |
|||
|
|||
parseInt :: Parser Int |
|||
parseInt = read <$> many1 digit |
|||
|
|||
decimal :: A.Parser Int |
|||
decimal = foldl' step 0 `fmap` A.takeWhile1 isDecimal |
|||
where |
|||
step a c = a * 10 + fromIntegral (ord c - 48) |
|||
isDecimal c = c >= '0' && c <= '9' |
|||
|
|||
|
|||
parseString :: Parser String |
|||
parseString = many1 $ satisfy (liftA2 (||) isAlphaNum isAllowed) |
|||
where isAllowed = flip elem "._" |
|||
|
|||
parseEndoSimao :: Parser [Transition Int Int Int] |
|||
parseEndoSimao = trans `endBy` newline |
|||
where |
|||
toTransition s i o t = Transition s i t o |
|||
trans = (toTransition <$> parseInt <* string " -- " <*> parseInt <* string " / " <*> parseInt <* string " -> " <*> parseInt) |
|||
|
|||
aparseEndoSimao :: A.Parser [Transition Int Int Int] |
|||
aparseEndoSimao = trans `A.sepBy` (char '\n') |
|||
where |
|||
toTransition s i o t = Transition s i t o |
|||
trans = (toTransition <$> decimal <* string " -- " <*> decimal <* string " / " <*> decimal <* string " -> " <*> decimal) |
|||
|
|||
parseYevtushenko :: Parser [Transition Int Int Int] |
|||
parseYevtushenko = header `endBy` newline *> (trans `endBy` newline) |
|||
where |
|||
header = choice |
|||
[ () <$ char 'F' <* space <* parseInt |
|||
, () <$ char 's' <* space <* parseInt |
|||
, () <$ char 'i' <* space <* parseInt |
|||
, () <$ char 'o' <* space <* parseInt |
|||
, () <$ string "n0" <* space <* parseInt |
|||
, () <$ char 'p' <* spaces <* parseInt |
|||
] |
|||
trans = Transition <$> parseInt <* space <*> parseInt <* space <*> parseInt <* space <*> parseInt |
|||
|
|||
parseDot :: Parser [Transition String String String] |
|||
parseDot = header *> (catMaybes <$> many1 transOrNothing) <* footer |
|||
where |
|||
header = manyTill anyChar (char '{') *> manyTill anyChar newline |
|||
footer = spaces *> char '}' |
|||
transOrNothing = optionMaybe trans <* manyTill anyChar newline |
|||
trans = toTransition <$> trimmedString <* string "->" <*> trimmedString <*> io |
|||
io = between (char '[') (char ']') ((string "label=" *> (between (char '"') (char '"') ((,) <$> trimmedString <* char '/' <*> trimmedString)))) |
|||
toTransition s t (i, o) = Transition s i t o |
|||
trimmedString = spaces *> parseString <* spaces |
|||
|
|||
main = do |
|||
input <- getContents |
|||
let m = parse parseEndoSimao "" input |
|||
case m of |
|||
Right ts -> print $ length ts |
|||
Left e -> print e |
@ -0,0 +1,23 @@ |
|||
import Text.Parsec.String |
|||
import Text.Parsec.Combinator |
|||
import Text.Parsec.Prim |
|||
import Text.Parsec.Token |
|||
import Text.Parsec.Language |
|||
import Control.Applicative |
|||
import Data.Functor.Identity |
|||
import Data.Functor.Compose |
|||
import Data.Functor.Constant |
|||
import Data.Functor.Product |
|||
import Data.Vector |
|||
|
|||
type WithOutput o = Product Identity (Constant o) |
|||
|
|||
data FSM t s i = FSM (s -> i -> t s) |
|||
type DeterministicFSM s i o = FSM (WithOutput o) s i |
|||
type PartialFSM s i o = FSM (Compose Maybe (WithOutput o)) s i |
|||
type NondeterministicFSM s i o = FSM (Compose [] (WithOutput o)) s i |
|||
|
|||
-- createMachine :: Vector (Vector (t Int)) -> FSM t Int Int |
|||
createMachine v = FSM (\s i -> v ! s ! i) |
|||
|
|||
main = print 10 |
@ -0,0 +1,2 @@ |
|||
import Distribution.Simple |
|||
main = defaultMain |
File diff suppressed because it is too large
@ -0,0 +1,79 @@ |
|||
{-# LANGUAGE RankNTypes #-} |
|||
|
|||
import Criterion.Main |
|||
import Data.List |
|||
import Data.Functor |
|||
import Data.Hashable |
|||
import qualified Data.ByteString.Char8 as BS |
|||
import qualified Data.ByteString as BSC |
|||
|
|||
import qualified Data.HashMap.Strict as HashMap (HashMap, insertWith, size, empty) |
|||
import qualified Data.HashMap.Lazy as LazyHashMap (HashMap, insertWith, size, empty) |
|||
|
|||
import qualified Data.Map.Strict as TreeMap (Map, insertWith, size, empty) |
|||
import qualified Data.Map.Lazy as LazyTreeMap (Map, insertWith, size, empty) |
|||
|
|||
import qualified Data.Trie as TrieMap (Trie, size, empty) |
|||
import qualified Data.Trie.Convenience as TrieMap (insertWith) |
|||
|
|||
import qualified Data.Discrimination.Grouping as EKmett (nub) |
|||
|
|||
data MapImpl m k a = MapImpl { |
|||
insertWith :: (Ord k, Hashable k) => (a -> a -> a) -> k -> a -> m -> m, |
|||
size :: m -> Int, |
|||
empty :: m |
|||
} |
|||
|
|||
update impl str m = (insertWith impl) (flip const) str ((size impl) m) m |
|||
computeMap impl = foldr (update impl) (empty impl) |
|||
test impl list = (size impl) (computeMap impl list) |
|||
|
|||
main = do |
|||
list <- map BSC.unpack . filter (not . BS.null) . BS.split '\n' <$> BS.getContents |
|||
defaultMain [ bench "hashMap" $ whnf (test hashMap) list |
|||
, bench "lazyHashMap" $ whnf (test lazyHashMap) list |
|||
, bench "treeMap" $ whnf (test treeMap) list |
|||
, bench "lazyTreeMap" $ whnf (test lazyTreeMap) list |
|||
--, bench "trieMap" $ whnf (test trieMap) list |
|||
, bench "ekmett nub" $ whnf (length . EKmett.nub) list |
|||
, bench "group . sort" $ whnf (length . group . sort) list |
|||
, bench "nub" $ whnf (length . nub) list |
|||
] |
|||
|
|||
--main = do |
|||
-- list <- filter (not . BS.null) . BS.split '\n' <$> BS.getContents |
|||
-- print $ test hashMap list |
|||
-- print $ test lazyHashMap list |
|||
-- print $ test treeMap list |
|||
-- print $ test lazyTreeMap list |
|||
-- print $ test trieMap list |
|||
|
|||
hashMap = MapImpl { |
|||
insertWith = HashMap.insertWith, |
|||
size = HashMap.size, |
|||
empty = HashMap.empty |
|||
} |
|||
|
|||
lazyHashMap = MapImpl { |
|||
insertWith = LazyHashMap.insertWith, |
|||
size = LazyHashMap.size, |
|||
empty = LazyHashMap.empty |
|||
} |
|||
|
|||
treeMap = MapImpl { |
|||
insertWith = TreeMap.insertWith, |
|||
size = TreeMap.size, |
|||
empty = TreeMap.empty |
|||
} |
|||
|
|||
lazyTreeMap = MapImpl { |
|||
insertWith = LazyTreeMap.insertWith, |
|||
size = LazyTreeMap.size, |
|||
empty = LazyTreeMap.empty |
|||
} |
|||
|
|||
trieMap = MapImpl { |
|||
insertWith = TrieMap.insertWith, |
|||
size = TrieMap.size, |
|||
empty = TrieMap.empty |
|||
} |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,22 @@ |
|||
foo |
|||
bar |
|||
foo |
|||
bar |
|||
foo |
|||
bar |
|||
foo |
|||
bar |
|||
blalba |
|||
baz |
|||
baz |
|||
baz |
|||
baz |
|||
foo |
|||
bar |
|||
baz |
|||
foo |
|||
iewn |
|||
bar |
|||
baz |
|||
vaeji |
|||
|
Reference in new issue