Skip to content

Commit aaa95c9

Browse files
committed
Clean up some state passing with do notation
1 parent 152fb8a commit aaa95c9

File tree

6 files changed

+130
-126
lines changed

6 files changed

+130
-126
lines changed

experiments/idris/src/Fathom/Base.idr

Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -69,21 +69,37 @@ parameters (Source, Target : Type)
6969

7070
namespace DecodePart
7171

72+
-- TODO: Should probably implement functor, applicative, or monad here. or use
73+
-- the reader, writer or state monad transformers
74+
7275
public export
7376
pure : {0 S, T : Type} -> S -> DecodePart S T
7477
pure source target = Just (source, target)
7578

79+
7680
public export
7781
map : {0 S1, S2, T : Type} -> (S1 -> S2) -> DecodePart S1 T -> DecodePart S2 T
7882
map f decode target =
7983
Prelude.map (\(source, target') => (f source, target)) (decode target)
8084

8185

86+
public export
87+
bind : {0 S1, S2, T : Type} -> DecodePart S1 T -> (S1 -> DecodePart S2 T) -> DecodePart S2 T
88+
bind decode1 decode2 target = do
89+
(source1, target') <- decode1 target
90+
decode2 source1 target'
91+
92+
93+
public export
94+
(>>=) : {0 S1, S2, T : Type} -> DecodePart S1 T -> (S1 -> DecodePart S2 T) -> DecodePart S2 T
95+
(>>=) = bind
96+
97+
8298
parameters {0 Source, Target : Type}
8399

84100
public export
85101
toDecodeFull : (Monoid Target, Eq Target) => DecodePart Source Target -> Decode Source Target
86-
toDecodeFull decode target = do
102+
toDecodeFull decode target = Prelude.do
87103
(source, target') <- decode target
88104
if target == neutral then Just source else Nothing
89105

@@ -160,14 +176,8 @@ data ByteOrder : Type where
160176

161177
namespace ByteStream
162178

163-
splitLen : (n : Nat) -> Colist a -> Maybe (Vect n a, Colist a)
164-
splitLen 0 _ = Nothing
165-
splitLen (S k) [] = Nothing
166-
splitLen (S k) (x :: rest) = Prelude.map (\(xs, rest') => (x :: xs, rest')) (splitLen k rest)
167-
168-
169179
export
170-
decodeU8 : Decode (Bits8, ByteStream) ByteStream
180+
decodeU8 : DecodePart Bits8 ByteStream
171181
decodeU8 [] = Nothing
172182
decodeU8 (x :: bytes) = Just (x, bytes)
173183

@@ -178,15 +188,15 @@ namespace ByteStream
178188

179189

180190
export
181-
decodeU16 : ByteOrder -> Decode (Bits16, ByteStream) ByteStream
182-
decodeU16 LE bytes = do
183-
(bs, bytes') <- splitLen 2 bytes
184-
let [b0, b1] = map (cast {to = Bits16}) bs
185-
Just (b0 .|. b1 `shiftL` fromNat 8, bytes')
186-
decodeU16 BE bytes = do
187-
(bs, bytes') <- splitLen 2 bytes
188-
let [b0, b1] = map (cast {to = Bits16}) bs
189-
Just (b0 `shiftL` fromNat 8 .|. b1, bytes')
191+
decodeU16 : ByteOrder -> DecodePart Bits16 ByteStream
192+
decodeU16 LE = DecodePart.do
193+
b0 <- map (cast {to = Bits16}) decodeU8
194+
b1 <- map (cast {to = Bits16}) decodeU8
195+
pure (b0 .|. b1 `shiftL` fromNat 8)
196+
decodeU16 BE = DecodePart.do
197+
b0 <- map (cast {to = Bits16}) decodeU8
198+
b1 <- map (cast {to = Bits16}) decodeU8
199+
pure (b0 `shiftL` fromNat 8 .|. b1)
190200

191201

192202
export
@@ -196,18 +206,26 @@ namespace ByteStream
196206

197207

198208
export
199-
decodeU32 : ByteOrder -> Decode (Bits32, ByteStream) ByteStream
200-
decodeU32 LE bytes = do
201-
(bs, bytes') <- splitLen 4 bytes
202-
let [b0, b1, b2, b3] = map (cast {to = Bits32}) bs
203-
Just (b0 .|. b1 `shiftL` fromNat 8 .|. b2 `shiftL` fromNat 16 .|. b2 `shiftL` fromNat 24, bytes')
204-
decodeU32 BE bytes = do
205-
(bs, bytes') <- splitLen 4 bytes
206-
let [b0, b1, b2, b3] = map (cast {to = Bits32}) bs
207-
Just (b0 `shiftL` fromNat 24 .|. b1 `shiftL` fromNat 16 .|. b2 `shiftL` fromNat 8 .|. b3, bytes')
209+
decodeU32 : ByteOrder -> DecodePart Bits32 ByteStream
210+
decodeU32 LE = DecodePart.do
211+
b0 <- map (cast {to = Bits32}) decodeU8
212+
b1 <- map (cast {to = Bits32}) decodeU8
213+
b2 <- map (cast {to = Bits32}) decodeU8
214+
b3 <- map (cast {to = Bits32}) decodeU8
215+
pure (b0 .|. b1 `shiftL` fromNat 8 .|. b2 `shiftL` fromNat 16 .|. b2 `shiftL` fromNat 24)
216+
decodeU32 BE = DecodePart.do
217+
b0 <- map (cast {to = Bits32}) decodeU8
218+
b1 <- map (cast {to = Bits32}) decodeU8
219+
b2 <- map (cast {to = Bits32}) decodeU8
220+
b3 <- map (cast {to = Bits32}) decodeU8
221+
pure (b0 `shiftL` fromNat 24 .|. b1 `shiftL` fromNat 16 .|. b2 `shiftL` fromNat 8 .|. b3)
208222

209223

210224
export
211225
encodeU32 : ByteOrder -> Encode Bits32 ByteStream
212226
encodeU32 LE x = Just [cast x, cast (x `shiftR` fromNat 8), cast (x `shiftR` fromNat 16), cast (x `shiftR` fromNat 24)]
213227
encodeU32 BE x = Just [cast (x `shiftR` fromNat 24), cast (x `shiftR` fromNat 16), cast (x `shiftR` fromNat 8), cast x]
228+
229+
230+
-- decodeU : Bits a => ByteOrder -> DecodePart a ByteStream
231+
-- encodeU : Bits a => ByteOrder -> Encode a ByteStream

experiments/idris/src/Fathom/Closed/IndexedInductive.idr

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -49,24 +49,21 @@ namespace FormatOf
4949

5050
export
5151
decode : {0 A, S : Type} -> (f : FormatOf A) -> Decode (A, Colist S) (Colist S)
52-
decode End [] = Just ((), [])
53-
decode End (_::_) = Nothing
54-
decode Fail _ = Nothing
55-
decode (Pure x) buffer =
56-
Just (MkSing x, buffer)
57-
decode (Skip f _) buffer = do
58-
(x, buffer') <- decode f buffer
59-
Just ((), buffer')
60-
decode (Repeat 0 f) buffer =
61-
Just ([], buffer)
62-
decode (Repeat (S len) f) buffer = do
63-
(x, buffer') <- decode f buffer
64-
(xs, buffer'') <- decode (Repeat len f) buffer'
65-
Just (x :: xs, buffer'')
66-
decode (Bind f1 f2) buffer = do
67-
(x, buffer') <- decode f1 buffer
68-
(y, buffer'') <- decode (f2 x) buffer'
69-
Just ((x ** y), buffer'')
52+
decode End =
53+
\case [] => Just ((), [])
54+
(_::_) => Nothing
55+
decode Fail = const Nothing
56+
decode (Pure x) = pure (MkSing x)
57+
decode (Skip f _) = map (const ()) (decode f)
58+
decode (Repeat 0 f) = pure []
59+
decode (Repeat (S len) f) = do
60+
x <- decode f
61+
xs <- decode (Repeat len f)
62+
pure (x :: xs)
63+
decode (Bind f1 f2) = do
64+
x <- decode f1
65+
y <- decode (f2 x)
66+
pure (x ** y)
7067

7168

7269
export

experiments/idris/src/Fathom/Closed/IndexedInductiveCustom.idr

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -62,26 +62,23 @@ namespace FormatOf
6262

6363

6464
export
65-
decode : {0 A : Type} -> (f : FormatOf A) -> Decode (A, ByteStream) ByteStream
66-
decode End [] = Just ((), [])
67-
decode End (_::_) = Nothing
68-
decode Fail _ = Nothing
69-
decode (Pure x) buffer =
70-
Just (MkSing x, buffer)
71-
decode (Skip f _) buffer = do
72-
(x, buffer') <- decode f buffer
73-
Just ((), buffer')
74-
decode (Repeat 0 f) buffer =
75-
Just ([], buffer)
76-
decode (Repeat (S len) f) buffer = do
77-
(x, buffer') <- decode f buffer
78-
(xs, buffer'') <- decode (Repeat len f) buffer'
79-
Just (x :: xs, buffer'')
80-
decode (Bind f1 f2) buffer = do
81-
(x, buffer') <- decode f1 buffer
82-
(y, buffer'') <- decode (f2 x) buffer'
83-
Just ((x ** y), buffer'')
84-
decode (Custom f) buffer = f.decode buffer
65+
decode : {0 A : Type} -> (f : FormatOf A) -> DecodePart A ByteStream
66+
decode End =
67+
\case [] => Just ((), [])
68+
(_::_) => Nothing
69+
decode Fail = const Nothing
70+
decode (Pure x) = pure (MkSing x)
71+
decode (Skip f _) = map (const ()) (decode f)
72+
decode (Repeat 0 f) = pure []
73+
decode (Repeat (S len) f) = do
74+
x <- decode f
75+
xs <- decode (Repeat len f)
76+
pure (x :: xs)
77+
decode (Bind f1 f2) = do
78+
x <- decode f1
79+
y <- decode (f2 x)
80+
pure (x ** y)
81+
decode (Custom f) = f.decode
8582

8683

8784
export

experiments/idris/src/Fathom/Closed/InductiveRecursive.idr

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -80,25 +80,22 @@ namespace Format
8080

8181

8282
export
83-
decode : (f : Format) -> Decode (Rep f, Colist a) (Colist a)
84-
decode End [] = Just ((), [])
85-
decode End (_::_) = Nothing
86-
decode Fail _ = Nothing
87-
decode (Pure x) buffer =
88-
Just (MkSing x, buffer)
89-
decode (Skip f _) buffer = do
90-
(x, buffer') <- decode f buffer
91-
Just ((), buffer')
92-
decode (Repeat 0 f) buffer =
93-
Just ([], buffer)
94-
decode (Repeat (S len) f) buffer = do
95-
(x, buffer') <- decode f buffer
96-
(xs, buffer'') <- decode (Repeat len f) buffer'
97-
Just (x :: xs, buffer'')
98-
decode (Bind f1 f2) buffer = do
99-
(x, buffer') <- decode f1 buffer
100-
(y, buffer'') <- decode (f2 x) buffer'
101-
Just ((x ** y), buffer'')
83+
decode : (f : Format) -> DecodePart (Rep f) (Colist a)
84+
decode End =
85+
\case [] => Just ((), [])
86+
(_::_) => Nothing
87+
decode Fail = const Nothing
88+
decode (Pure x) = pure (MkSing x)
89+
decode (Skip f _) = map (const ()) (decode f)
90+
decode (Repeat 0 f) = pure []
91+
decode (Repeat (S len) f) = do
92+
x <- decode f
93+
xs <- decode (Repeat len f)
94+
pure (x :: xs)
95+
decode (Bind f1 f2) = do
96+
x <- decode f1
97+
y <- decode (f2 x)
98+
pure (x ** y)
10299

103100

104101
export

experiments/idris/src/Fathom/Closed/InductiveRecursiveCustom.idr

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -81,26 +81,23 @@ namespace Format
8181

8282

8383
export
84-
decode : (f : Format) -> Decode (Rep f, ByteStream) ByteStream
85-
decode End [] = Just ((), [])
86-
decode End (_::_) = Nothing
87-
decode Fail _ = Nothing
88-
decode (Pure x) buffer =
89-
Just (MkSing x, buffer)
90-
decode (Skip f _) buffer = do
91-
(x, buffer') <- decode f buffer
92-
Just ((), buffer')
93-
decode (Repeat 0 f) buffer =
94-
Just ([], buffer)
95-
decode (Repeat (S len) f) buffer = do
96-
(x, buffer') <- decode f buffer
97-
(xs, buffer'') <- decode (Repeat len f) buffer'
98-
Just (x :: xs, buffer'')
99-
decode (Bind f1 f2) buffer = do
100-
(x, buffer') <- decode f1 buffer
101-
(y, buffer'') <- decode (f2 x) buffer'
102-
Just ((x ** y), buffer'')
103-
decode (Custom f) buffer = f.decode buffer
84+
decode : (f : Format) -> DecodePart (Rep f) ByteStream
85+
decode End =
86+
\case [] => Just ((), [])
87+
(_::_) => Nothing
88+
decode Fail = const Nothing
89+
decode (Pure x) = pure (MkSing x)
90+
decode (Skip f _) = map (const ()) (decode f)
91+
decode (Repeat 0 f) = pure []
92+
decode (Repeat (S len) f) = do
93+
x <- decode f
94+
xs <- decode (Repeat len f)
95+
pure (x :: xs)
96+
decode (Bind f1 f2) = do
97+
x <- decode f1
98+
y <- decode (f2 x)
99+
pure (x ** y)
100+
decode (Custom f) = f.decode
104101

105102

106103
export

experiments/idris/src/Fathom/Open/Record.idr

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public export
2929
record Format where
3030
constructor MkFormat
3131
Rep : Type
32-
decode : Decode (Rep, ByteStream) ByteStream
32+
decode : DecodePart Rep ByteStream
3333
encode : Encode Rep ByteStream
3434

3535

@@ -41,7 +41,7 @@ namespace Format
4141
Rep : Type
4242
Rep = Unit
4343

44-
decode : Decode (Rep, ByteStream) ByteStream
44+
decode : DecodePart Rep ByteStream
4545
decode [] = Just ((), [])
4646
decode (_::_) = Nothing
4747

@@ -55,8 +55,8 @@ namespace Format
5555
Rep : Type
5656
Rep = Void
5757

58-
decode : Decode (Rep, ByteStream) ByteStream
59-
decode _ = Nothing
58+
decode : DecodePart Rep ByteStream
59+
decode = const Nothing
6060

6161
encode : Encode Rep ByteStream
6262
encode x = void x
@@ -68,8 +68,8 @@ namespace Format
6868
Rep : Type
6969
Rep = Sing x
7070

71-
decode : Decode (Rep, ByteStream) ByteStream
72-
decode buffer = Just (MkSing x, buffer)
71+
decode : DecodePart Rep ByteStream
72+
decode = pure (MkSing x)
7373

7474
encode : Encode Rep ByteStream
7575
encode (MkSing _) = Just []
@@ -81,10 +81,8 @@ namespace Format
8181
Rep : Type
8282
Rep = ()
8383

84-
decode : Decode (Rep, ByteStream) ByteStream
85-
decode buffer = do
86-
(x, buffer') <- f.decode buffer
87-
Just ((), buffer')
84+
decode : DecodePart Rep ByteStream
85+
decode = map (const ()) f.decode
8886

8987
encode : Encode Rep ByteStream
9088
encode () = f.encode def
@@ -96,14 +94,14 @@ namespace Format
9694
Rep : Type
9795
Rep = Vect len f.Rep
9896

99-
decode : Decode (Rep, ByteStream) ByteStream
97+
decode : DecodePart Rep ByteStream
10098
decode = go len where
101-
go : (len : Nat) -> Decode (Vect len f.Rep, ByteStream) ByteStream
102-
go 0 buffer = Just ([], buffer)
103-
go (S len) buffer = do
104-
(x, buffer') <- f.decode buffer
105-
(xs, buffer'') <- go len buffer'
106-
Just (x :: xs, buffer'')
99+
go : (len : Nat) -> DecodePart (Vect len f.Rep) ByteStream
100+
go 0 = pure []
101+
go (S len) = do
102+
x <- f.decode
103+
xs <- go len
104+
pure (x :: xs)
107105

108106
encode : Encode Rep ByteStream
109107
encode = go len where
@@ -119,11 +117,11 @@ namespace Format
119117
Rep : Type
120118
Rep = (x : f1.Rep ** (f2 x).Rep)
121119

122-
decode : Decode (Rep, ByteStream) ByteStream
123-
decode buffer = do
124-
(x, buffer') <- f1.decode buffer
125-
(y, buffer'') <- (f2 x).decode buffer'
126-
Just ((x ** y), buffer'')
120+
decode : DecodePart Rep ByteStream
121+
decode = do
122+
x <- f1.decode
123+
y <- (f2 x).decode
124+
pure (x ** y)
127125

128126
encode : Encode Rep ByteStream
129127
encode (x ** y) =
@@ -184,7 +182,7 @@ data FormatOf : (A : Type) -> Type where
184182

185183
namespace FormatOf
186184

187-
decode : {0 A : Type} -> (f : FormatOf A) -> Decode (A, ByteStream) ByteStream
185+
decode : {0 A : Type} -> (f : FormatOf A) -> DecodePart (A) ByteStream
188186
decode (MkFormatOf f) = Format.decode f
189187

190188

0 commit comments

Comments
 (0)