I have just updated the code (on my repo that contains MVC.hs) so that the
end of game is now considered a Right value.
So I have introduced the type:
data ScoreBoard = Done Int | Current (Int, Board) deriving (Show, Eq)
and `score` has now this signature:
score :: Int -> Board -> Either String ScoreBoard
These changes have cleaned up the MVC code a bit (for instance it does not
need to know about `isGameOver` anymore)
`pipeScore` is even more stupid than before so there must be a better way
to re-conciliate the APIs.
pipeScore :: (Monad m) => Board -> Pipe (Either String Int) (Either String
ScoreBoard) m ()
pipeScore = go
where
go b = do
for cat $ \x -> case x of
Left s -> yield (Left s)
Right n -> do
case score n b of
Right c@(Current (_, b')) -> do
yield (Right c)
go b'
Right (Done s) ->
yield $ Right (Done s)
Left msg -> do
yield (Left msg)
go b
@Patrick, my repos contain the merged code:
https://github.com/PierreR/afgame/tree/master/haskell
I will probably follow your advice about keeping only one level of loop. I
still don't get how to apply `right` from pipe-extra though (your
pipeScore' doesn't compile). I will give it another try as soon as I
understand this better. Thanks for your help.
Cheers
On Sunday, May 11, 2014 2:39:50 PM UTC+2, Davorak wrote:
>
> @Tony - I am getting a 404 for that link[1]. The base repo is there by I
> can not find the MVC example with a github search.
>
> [1]
> https://github.com/tonyday567/afgame/blob/mvc-example/haskell/src/Afgame/MVC.hs
>
> On Wed, May 7, 2014 at 10:51 PM, Tony Day <[email protected]<javascript:>
> > wrote:
>
>> Hi Pierre,
>>
>> I coded up your front-end in the spirit of Gabe's mvc library. I know
>> you didn't ask that, of course, but G has asked for examples of using the
>> mvc library and your example was perfect for the task.
>>
>>
>> https://github.com/tonyday567/afgame/blob/mvc-example/haskell/src/Afgame/MVC.hs
>>
>> I liked how it turned out. Most of the IO in the existing pipes became
>> messages that get wrapped as part of an Either String (Int,Board). Not
>> perfect but, with the pipeline getting a bit messier.
>>
>> Most fun was using quickcheck on the game logic. I can guess from qc
>> that the game lasts for 15 moves, that a high score is around 200, and that
>> moves of 15 and consecutive moves that add up to 15 are strong. Not bad
>> considering I haven't even read the rules!
>>
>>
>> On Tuesday, May 6, 2014 5:32:37 AM UTC+10, Pierre R wrote:
>>>
>>> Hi,
>>>
>>> I have added a little pipes frontend to one of my pet example and I was
>>> wondering how idiomatic (or not) it is.
>>>
>>> http://lpaste.net/103623
>>>
>>> Basically instead of consuming a list with mapM (the `scores` function)
>>> I am streaming input from stdin. Consequently I need to treat the end of
>>> game differently than a bogus shot.
>>>
>>> Nothing to do with Pipes but I am not sure annotation 2 is better
>>> because it forces all client `score` code to unwrap StateT whereas I only
>>> need the state monad when I have to deal with a list of shots. Is there a
>>> more idiomatic way to do this ?
>>>
>>> The github repo is here : https://github.com/PierreR/
>>> afgame/tree/master/haskell
>>>
>>> Thanks for your feedback
>>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Haskell Pipes" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected] <javascript:>.
>> To post to this group, send email to [email protected]<javascript:>
>> .
>>
>
>
>
> --
> Patrick Wheeler
> [email protected] <javascript:>
> [email protected] <javascript:>
> [email protected] <javascript:>
>
--
You received this message because you are subscribed to the Google Groups
"Haskell Pipes" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].