smalltalk-tng

view doc/new-ideas.thing @ 321:c4a0718c2d3c

Sketch of dependencies
author Tony Garnock-Jones <tonygarnockjones@gmail.com>
date Sat Oct 08 15:36:03 2011 -0400 (7 months ago)
parents
children
line source
1 Use monads to structure the passing of state??
2 do { var <- expr
3 ; some action in the monad of choice
4 ; return value }
6 -- ????
7 expr >>= \var . some_action >>= \dummy . return value
9 [ ch1 <- next. ch2 <- next. return: foo ] `with: s.
11 [ {socket:. state:. len:. index:} <- read.
12 ???
14 in s { ch1 <- next
15 ; ch2 <- next
16 ; return foo }
22 SocketCharProvider <- {socket: Nil. state: ''. len: 0. index: 0}.
24 self@SocketCharProvider newOn: socket [
25 self \ { socket: socket }.
26 ].
28 self@SocketCharProvider next [
29 {socket:. state:. len:. index:} <- self.
30 state == EOF ifTrue: [ ^ {state. self} ].
31 index >= len ifFalse: [ ^ {state at: index. self \ {index: index + 1}} ].
33 newState <- socket read.
34 newState
35 ifNil: [ (self \ {state: EOF. len: 0. index: 0}) next ]
36 ifNotNil: [ (self \ {state: newState. len: newState size. index: 0}) next ].
37 ]
39 {ch1. s} <- s next.
40 {ch2. s} <- s next.
46 SocketCharProvider <- {socket: Nil. state: Nil}.
48 self@SocketCharProvider newOn: socket [
49 self \ { socket: socket. state: {buf: ''. len: 0. index: 0} ref }.
50 ].
52 self@SocketCharProvider next [
53 {socket:. state:.} <- self.
54 [
55 [
56 {buf:. len:. index:.} <- state read.
57 buf == EOF ifTrue: [ ^ buf ].
58 index >= len ifFalse: [ state write: state peek \ { index: index + 1 }. ^ buf at: index ].
60 newState <- socket read.
61 newState
62 ifNil: [ state write: {buf: EOF. len: 0. index: 0} ]
63 ifNotNil: [ state write: {buf: newState. len: newState size. index: 0} ].
64 ] loop.
65 ] transaction.
66 ]
68 ch1 <- s next.
69 ch2 <- s next.
73 Globals at: #ThingSDL put: {super*: SDL.}.
75 self@ThingSDL delay: ms
76 [
77 nextEventTime <- Time now + (ms / 1000.0).
78 result <- SDLNet checkSockets (self socketSet) 0.
79 (result isNotNil and: [result isPositive])
80 ifTrue: [
81 {ready. unready} <- self activeSockets partition: [ record | record key isReady ].
82 self activeSockets: unready.
83 ready do: [ record |
84 sock <- record key.
85 suspension <- record value.
86 self socketSet delSocket: sock.
87 metalevel resume: suspension with: sock
88 ]
89 ].
90 metalevel runRunnableSuspensionsUntil: nextEventTime.
91 ]