antisplice 0.11.0.3 → 0.11.0.4
raw patch · 2 files changed
+59/−2 lines, 2 files
Files
antisplice.cabal view
@@ -10,7 +10,7 @@ -- PVP summary: +-+------- breaking API changes -- | | +----- non-breaking API additions -- | | | +--- code changes with no API change-version: 0.11.0.3+version: 0.11.0.4 -- A short (one-line) description of the package. synopsis: An engine for text-based dungeons.@@ -48,7 +48,7 @@ library -- Modules exported by the library.- exposed-modules: Game.Antisplice.Prototypes, Game.Antisplice.Templates, Game.Antisplice.Lang, Game.Antisplice.Monad, Game.Antisplice.Rooms, Game.Antisplice.Errors, Game.Antisplice.Utils.TST, Game.Antisplice.Utils.AVL, Game.Antisplice.Utils.Run, Game.Antisplice.Utils.BST, Game.Antisplice.Utils.Graph, Game.Antisplice.Utils.Counter, Game.Antisplice.Utils.Fail, Game.Antisplice.Monad.Dungeon, Game.Antisplice.Terminal.Repl, Game.Antisplice.Events, Game.Antisplice.Monad.Vocab, Game.Antisplice.Utils.Atoms, Game.Antisplice.Stats, Game.Antisplice.Utils.None, Game.Antisplice.Utils.Focus, Game.Antisplice.SingleUser, Game.Antisplice, Game.Antisplice.Skills, Game.Antisplice.Stereos, Game.Antisplice.Paths, Game.Antisplice.Action+ exposed-modules: Game.Antisplice.Prototypes, Game.Antisplice.Templates, Game.Antisplice.Lang, Game.Antisplice.Monad, Game.Antisplice.Rooms, Game.Antisplice.Errors, Game.Antisplice.Utils.TST, Game.Antisplice.Utils.AVL, Game.Antisplice.Utils.Run, Game.Antisplice.Utils.BST, Game.Antisplice.Utils.Graph, Game.Antisplice.Utils.Counter, Game.Antisplice.Utils.Fail, Game.Antisplice.Monad.Dungeon, Game.Antisplice.Terminal.Repl, Game.Antisplice.Events, Game.Antisplice.Monad.Vocab, Game.Antisplice.Utils.Atoms, Game.Antisplice.Stats, Game.Antisplice.Utils.None, Game.Antisplice.Utils.Focus, Game.Antisplice.SingleUser, Game.Antisplice, Game.Antisplice.Skills, Game.Antisplice.Stereos, Game.Antisplice.Paths, Game.Antisplice.Action, Game.Antisplice.Utils.ListBuilder -- Modules included in this library but not exported. -- other-modules:
+ src/Game/Antisplice/Utils/ListBuilder.hs view
@@ -0,0 +1,57 @@+{-# LANGUAGE TypeSynonymInstances, MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, FlexibleContexts #-}++module Game.Antisplice.Utils.ListBuilder where++import Control.Arrow+import Control.Monad.Trans.Class+import Control.Monad.Identity++class Monad l => ListBuilder l i | l -> i where+ li :: i -> l ()+ buildList :: l () -> [i]++newtype StrictBuilderT i m a = StrictBuilder { runStrictBuilderT :: [i] -> m (a,[i]) }+type StrictBuilder i = StrictBuilderT i Identity++instance Functor m => Functor (StrictBuilderT i m) where+ fmap f a = StrictBuilder $ \s -> fmap (first f) $ runStrictBuilderT a s++instance Monad m => Monad (StrictBuilderT i m) where+ return a = StrictBuilder $ \s -> return (a,s)+ m >>= f = StrictBuilder $ \s -> do (a,s') <- runStrictBuilderT m s; runStrictBuilderT (f a) s'++instance MonadTrans (StrictBuilderT i) where+ lift m = StrictBuilder $ \s -> do a <- m; return (a,s)++instance ListBuilder (StrictBuilder i) i where+ li a = seq a $ StrictBuilder $ \s -> return ((),s++[a])+ buildList m = snd $ runIdentity $ runStrictBuilderT m []++strictBuild :: StrictBuilderT i Identity () -> [i]+strictBuild = buildList++newtype LazyBuilderT i m a = LazyBuilder { runLazyBuilderT :: ([i] -> [i]) -> m (a,[i] -> [i]) }+type LazyBuilder i = LazyBuilderT i Identity++instance Functor m => Functor (LazyBuilderT i m) where+ fmap f a = LazyBuilder $ \s -> fmap (first f) $ runLazyBuilderT a s++instance Monad m => Monad (LazyBuilderT i m) where+ return a = LazyBuilder $ \s -> return (a,s)+ m >>= f = LazyBuilder $ \s -> do (a,s') <- runLazyBuilderT m s; runLazyBuilderT (f a) s'++instance MonadTrans (LazyBuilderT i) where+ lift m = LazyBuilder $ \s -> do a <- m; return (a,s)++instance ListBuilder (LazyBuilder i) i where+ li a = LazyBuilder $ \s -> return ((),s.([a]++))+ buildList m = ($[]) $ snd $ runIdentity $ runLazyBuilderT m ([]++)++lazyBuild :: LazyBuilderT i Identity () -> [i]+lazyBuild = buildList++lis :: ListBuilder l i => [i] -> l ()+lis = mapM_ li++lit :: ListBuilder l (a,b) => a -> b -> l ()+lit a b = li (a,b)