packages feed

prototype 0.3 → 0.4.1

raw patch · 2 files changed

+42/−20 lines, 2 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Control.Prototype: instance Show (PTEnv m)
+ Control.Prototype: package :: Monad m => String -> PTMonad m a -> PTMonad m a

Files

prototype.cabal view
@@ -2,7 +2,7 @@ cabal-version:	>= 1.2  name:		prototype-version:	0.3+version:	0.4.1 stability:	experimental author:		Yoshikuni Jujo <PAF01143@nifty.ne.jp> maintainer:	Yoshikuni Jujo <PAF01143@nifty.ne.jp>@@ -26,17 +26,19 @@ 		> 		> main :: IO () 		> main = fmap fst $ flip runPT initPTEnv $ do-		>	dog <- clone object-		>	name	<- makeMember "name"-		>	setName	<- makeMember "setName"-		>	sit	<- makeMember "sit"-		>	setMethod dog setName $ \this [ n ] -> do-		>		setMember this name n-		>		return [ ]-		>	setMethod dog sit $ \this _ -> do-		>		n <- member this name-		>		liftPT $ putStrLn $ fromPrimStr n ++ " sitting."-		>		return [ ]+		>	( dog, setName, sit ) <- package "dog" $ do+		>		dog <- clone object+		>		name	<- makeMember "name"+		>		setName	<- makeMember "setName"+		>		sit	<- makeMember "sit"+		>		setMethod dog setName $ \this [ n ] -> do+		>			setMember this name n+		>			return [ ]+		>		setMethod dog sit $ \this _ -> do+		>			n <- member this name+		>			liftPT $ putStrLn $ fromPrimStr n ++ " sitting."+		>			return [ ]+		>		return ( dog, setName, sit ) 		>	myDog <- clone dog 		>	method myDog setName [ primStr "John" ] 		>	method myDog sit [ ]
src/Control/Prototype.hs view
@@ -16,6 +16,8 @@ 	setMember, 	setMethod, +	package,+ 	liftPT, 	primInt, 	primStr,@@ -27,7 +29,7 @@  import Prelude hiding ( head ) import "monads-tf" Control.Monad.State (-	StateT, runStateT, lift, MonadIO, liftIO, modify, gets )+	StateT, runStateT, lift, MonadIO, liftIO, put, get, gets ) import Data.List ( (\\) ) import Data.Maybe ( fromMaybe, listToMaybe ) @@ -47,10 +49,16 @@ liftPT :: Monad m => m a -> PTMonad m a liftPT = lift -type PTEnv m = [ ObjectBody m ]+data PTEnv m = PTEnv {+	packageName	:: String,+	objectBodys	:: [ ObjectBody m ]+ } deriving Show  initPTEnv :: PTEnv m-initPTEnv = [ ObjectBody object [ ] ]+initPTEnv = PTEnv {+	packageName	= "main",+	objectBodys	= [ ObjectBody object [ ] ]+ }  data Object = 	ObjectId { fromObjId :: Int } |@@ -85,18 +93,20 @@ --------------------------------------------------------------------------------  getNewId :: Monad m => PTMonad m Object-getNewId = gets $-	ObjectId . head err . ( [ 1 .. ] \\ ) .	map ( fromObjId . objectId )+getNewId = gets $ ObjectId . head err . ( [ 1 .. ] \\ ) .+	map ( fromObjId . objectId ) . objectBodys 	where 	err = error "too many objects"  getObject :: Monad m => Object -> PTMonad m ( ObjectBody m )-getObject obj =	gets $ head err . filter ( ( == obj ) . objectId )+getObject obj =	gets $ head err . filter ( ( == obj ) . objectId ) . objectBodys 	where 	err = error $ "no such object: " ++ show obj  putObject :: Monad m => ObjectBody m -> PTMonad m ()-putObject = modify . ( : )+putObject objBody = do+	env@PTEnv { objectBodys = obs } <- get+	put env { objectBodys = objBody : obs }  clone :: Monad m => Object -> PTMonad m Object clone obj = do@@ -106,7 +116,8 @@ 	return newId  makeMember :: Monad m => String -> PTMonad m Member-makeMember = return . Member+makeMember name =+	mmap ( Member . ( ++ name ) . ( ++ "::" ) ) $ gets packageName  member :: Monad m => Object -> Member -> PTMonad m Object member obj mem =@@ -128,6 +139,15 @@ 	newId <- getNewId 	putObject $ Method newId met 	setMember obj mem newId++package :: Monad m => String -> PTMonad m a -> PTMonad m a+package pkg act = do+	env0@PTEnv { packageName = oldPkg } <- get+	put env0 { packageName = pkg }+	ret <- act+	env1 <- get+	put env1 { packageName = oldPkg }+	return ret  printMemberName :: MonadIO m => Member -> m () printMemberName ( Member name ) = liftIO $ putStrLn name