ref: f4a939a2cfdc00643b02c404b0acbed382964dd0
parent: b4252aeded2d15592fe940e20f533f113000c61d
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Dec 30 14:23:12 EST 2017
Start cleaning up libstd. minor formatting, factoring out iterutil.
--- a/lib/bld.sub
+++ b/lib/bld.sub
@@ -6,6 +6,7 @@
fileutil
http
inifile
+ iter
json
regex
std
--- /dev/null
+++ b/lib/iter/bld.sub
@@ -1,0 +1,7 @@
+lib iter =
+ chunk.myr
+ enum.myr
+ ref.myr
+ reverse.myr
+ zip.myr
+;;
--- /dev/null
+++ b/lib/iter/chunk.myr
@@ -1,0 +1,34 @@
+use std
+
+pkg iter =
+ type chunkiter(@a) = struct
+ idx : std.size
+ blksz : std.size
+ sl : @a[:]
+ ;;
+
+ impl iterable chunkiter(@a) -> @a[:]
+ generic bychunk : (a : @a[:], chunk : std.size -> chunkiter(@a))
+;;
+
+generic bychunk = {a, sz
+ -> [.sl = a, .idx = 0, .blksz = sz]
+}
+
+impl iterable chunkiter(@a) -> @a[:] =
+ __iternext__ = {itp, valp
+ var len
+
+ len = std.min(itp.blksz, itp.sl.len - itp.idx)
+ if itp.idx + len == itp.sl.len
+ -> false
+ ;;
+ valp# = itp.sl[itp.idx: itp.idx + len]
+ itp.idx += itp.blksz
+ -> true
+ }
+
+ __iterfin__ = {itp, valp
+ }
+;;
+
--- /dev/null
+++ b/lib/iter/enum.myr
@@ -1,0 +1,30 @@
+use std
+
+pkg iter =
+ type enumiter(@a) = struct
+ idx : std.size
+ sl : @a[:]
+ ;;
+
+ impl iterable enumiter(@a) -> (std.size, @a)
+ generic byenum : (a : @a[:] -> enumiter(@a))
+;;
+
+generic byenum = {a
+ -> [.sl = a, .idx = 0]
+}
+
+impl iterable enumiter(@a) -> (std.size, @a) =
+ __iternext__ = {itp, valp
+ if itp.idx == itp.sl.len
+ -> false
+ ;;
+ valp# = (itp.idx, itp.sl[itp.idx])
+ itp.idx++
+ -> true
+ }
+
+ __iterfin__ = {itp, valp
+ }
+;;
+
--- /dev/null
+++ b/lib/iter/ref.myr
@@ -1,0 +1,29 @@
+use std
+
+pkg iter =
+ type refiter(@a) = struct
+ idx : std.size
+ sl : @a[:]
+ ;;
+ impl iterable refiter(@a) -> @a#
+ generic byref : (sl : @a[:] -> refiter(@a))
+;;
+
+generic byref = {a
+ -> [.sl = a, .idx = 0]
+}
+
+impl iterable refiter(@a) -> @a# =
+ __iternext__ = {itp, valp
+ if itp.idx == itp.sl.len
+ -> false
+ ;;
+ valp# = &itp.sl[itp.idx]
+ itp.idx++
+ -> true
+ }
+
+ __iterfin__ = {itp, valp
+ }
+;;
+
--- /dev/null
+++ b/lib/iter/reverse.myr
@@ -1,0 +1,30 @@
+use std
+
+pkg iter =
+ type reverseiter(@a) = struct
+ sl : @a[:]
+ idx : std.size
+ ;;
+ impl iterable reverseiter(@a) -> @a
+ generic byreverse : (sl : @a[:] -> reverseiter(@a))
+;;
+
+generic byreverse = {sl
+ -> [.sl = sl, .idx = sl.len]
+}
+
+impl iterable reverseiter(@a) -> @a =
+ __iternext__ = {itp, valp
+ if itp.idx > 0
+ valp# = itp.sl[itp.idx - 1]
+ itp.idx--
+ -> true
+ else
+ -> false
+ ;;
+ }
+
+ __iterfin__ = {itp, valp
+ }
+;;
+
--- /dev/null
+++ b/lib/iter/test/enum.myr
@@ -1,0 +1,12 @@
+use std
+
+const main = {
+ var n
+
+ n = 0
+ for (x, i) : std.byenum([1,3,5,7,9][:])
+ std.assert(x == n, "invalid enum idx {}", x)
+ std.assert(i == n*2 + 1, "invalid enum val {}", i)
+ n++
+ ;;
+}
--- /dev/null
+++ b/lib/iter/test/reverse.myr
@@ -1,0 +1,14 @@
+use std
+use iter
+
+const main = {
+ var n, l : int[:]
+
+ n = 0
+ l = [3, 2, 1, 0][:]
+ for x : iter.byreverse(l)
+ std.assert(x == n, "invalid reversed value {}, expected {}", x, n)
+ n++
+ ;;
+
+}
--- /dev/null
+++ b/lib/iter/test/zip.myr
@@ -1,0 +1,15 @@
+use std
+use iter
+
+const main = {
+ var n, la : int[:], lb : int[:]
+
+ n = 0
+ la = [0,2,4,6,8][:]
+ lb = [2,4][:]
+ for (a, b) : iter.byzip(la, lb)
+ std.assert(a == n*2, "invalid val from a: {}", a)
+ std.assert(b == n*2 + 2, "invalid val from b: {}", b)
+ n++
+ ;;
+}
--- /dev/null
+++ b/lib/iter/zip.myr
@@ -1,0 +1,30 @@
+pkg iter =
+ type zipiter(@a, @b) = struct
+ s1 : @a[:]
+ s2 : @b[:]
+ ;;
+
+ impl iterable zipiter(@a, @b) -> (@a, @b)
+ generic byzip : (a : @a[:], b : @b[:] -> zipiter(@a, @b))
+;;
+
+generic byzip = {a, b
+ -> [.s1 = a, .s2 = b]
+}
+
+impl iterable zipiter(@a, @b) -> (@a, @b) =
+ __iternext__ = {itp, valp
+ if itp.s1.len > 0 && itp.s2.len > 0
+ valp# = (itp.s1[0], itp.s2[0])
+ itp.s1 = itp.s1[1:]
+ itp.s2 = itp.s2[1:]
+ -> true
+ else
+ -> false
+ ;;
+ }
+
+ __iterfin__ = {itp, valp
+ }
+;;
+
--- a/lib/std/alloc.myr
+++ b/lib/std/alloc.myr
@@ -31,15 +31,15 @@
*/
pkg std =
- generic alloc : ( -> @a#)
- generic zalloc : ( -> @a#)
- generic free : (v:@a# -> void)
+ generic alloc : ( -> @a#)
+ generic zalloc : ( -> @a#)
+ generic free : (v:@a# -> void)
- generic slalloc : (len : size -> @a[:])
- generic slzalloc : (len : size -> @a[:])
- generic slgrow : (sl : @a[:]#, len : size -> @a[:])
- generic slzgrow : (sl : @a[:]#, len : size -> @a[:])
- generic slfree : (sl : @a[:] -> void)
+ generic slalloc : (len : size -> @a[:])
+ generic slzalloc : (len : size -> @a[:])
+ generic slgrow : (sl : @a[:]#, len : size -> @a[:])
+ generic slzgrow : (sl : @a[:]#, len : size -> @a[:])
+ generic slfree : (sl : @a[:] -> void)
;;
type slheader = struct
--- a/lib/std/bld.sub
+++ b/lib/std/bld.sub
@@ -38,7 +38,6 @@
intparse.myr
introspect.myr
ipparse.myr
- iterutil.myr
mk.myr
mkpath.myr
mktemp.myr
--- a/lib/std/bytealloc.myr
+++ b/lib/std/bytealloc.myr
@@ -1,4 +1,5 @@
use sys
+
use "die"
use "extremum"
use "memops"
@@ -14,17 +15,16 @@
const startalloctrace : (f : byte[:] -> void)
const endalloctrace : (-> void)
- /* public for testing */
- pkglocal const zbytealloc : (sz:size -> byte#)
- const bytealloc : (sz:size -> byte#)
- const bytefree : (m:byte#, sz:size -> void)
-
/* null pointers. only used internally. */
pkglocal const Zsliceptr = (0 : byte#)
pkglocal const Align = 16 /* minimum allocation alignment */
- pkglocal const align : (m : std.size, align : std.size -> std.size)
- pkglocal const allocsz : (sz : std.size -> std.size)
+ /* exported for testing */
+ const bytealloc : (sz:size -> byte#)
+ const bytefree : (m:byte#, sz:size -> void)
+ pkglocal const zbytealloc : (sz:size -> byte#)
+ pkglocal const align : (m : std.size, align : std.size -> std.size)
+ pkglocal const allocsz : (sz : std.size -> std.size)
;;
--- a/lib/std/clear.myr
+++ b/lib/std/clear.myr
@@ -1,4 +1,5 @@
use "slfill"
+
pkg std =
generic clear : (p : @a# -> void)
;;
--- a/lib/std/cmp.myr
+++ b/lib/std/cmp.myr
@@ -10,9 +10,9 @@
`After
;;
- generic numcmp : (a : @a, b : @a -> order)
- const strcmp : (a : byte[:], b : byte[:] -> order)
- const strncmp : (a : byte[:], b : byte[:], n : size -> order)
+ generic numcmp : (a : @a, b : @a -> order)
+ const strcmp : (a : byte[:], b : byte[:] -> order)
+ const strncmp : (a : byte[:], b : byte[:], n : size -> order)
const strcasecmp : (a : byte[:], b : byte[:] -> order)
;;
--- a/lib/std/dialparse+posixy.myr
+++ b/lib/std/dialparse+posixy.myr
@@ -13,8 +13,8 @@
pkg std =
pkglocal const parseport : (port : byte[:] -> option(uint16))
- pkglocal const getaddr : (addr : byte[:] -> result(netaddr, byte[:]))
- pkglocal const nameseg : (str : byte[:] -> option((byte[:], byte[:])))
+ pkglocal const getaddr : (addr : byte[:] -> result(netaddr, byte[:]))
+ pkglocal const nameseg : (str : byte[:] -> option((byte[:], byte[:])))
;;
const parseport = {port
--- a/lib/std/fltfmt.myr
+++ b/lib/std/fltfmt.myr
@@ -10,7 +10,7 @@
use "memops"
pkg std =
- pkglocal const MNormal = 0
+ pkglocal const MNormal = 0
pkglocal const MAbsolute = 1
pkglocal const MRelative = 2
--- a/lib/std/getcwd.myr
+++ b/lib/std/getcwd.myr
@@ -1,9 +1,9 @@
-
use "alloc"
use "errno"
use "extremum"
use "syswrap"
use "syswrap-ss"
+
pkg std =
const getcwd : (-> byte[:])
;;
--- a/lib/std/hasprefix.myr
+++ b/lib/std/hasprefix.myr
@@ -1,4 +1,5 @@
use "cmp"
+
pkg std =
const hasprefix : (s : byte[:], pre : byte[:] -> bool)
;;
--- a/lib/std/hassuffix.myr
+++ b/lib/std/hassuffix.myr
@@ -1,4 +1,5 @@
use "sleq"
+
pkg std =
const hassuffix : (s : byte[:], suff : byte[:] -> bool)
;;
--- a/lib/std/ipparse.myr
+++ b/lib/std/ipparse.myr
@@ -15,7 +15,6 @@
use "utf"
pkg std =
-
type netaddr = union
`Ipv4 byte[4]
`Ipv6 byte[16]
--- a/lib/std/iterutil.myr
+++ /dev/null
@@ -1,140 +1,0 @@
-use "types"
-use "fmt"
-use "extremum"
-
-pkg std =
- type zipiter(@a, @b) = struct
- s1 : @a[:]
- s2 : @b[:]
- ;;
-
- type reverseiter(@a) = struct
- sl : @a[:]
- idx : size
- ;;
-
- type enumiter(@a) = struct
- idx : size
- sl : @a[:]
- ;;
-
- type refiter(@a) = struct
- idx : size
- sl : @a[:]
- ;;
-
- type chunkiter(@a) = struct
- idx : size
- blksz : size
- sl : @a[:]
- ;;
-
- impl iterable zipiter(@a, @b) -> (@a, @b)
- impl iterable enumiter(@a) -> (size, @a)
- impl iterable reverseiter(@a) -> @a
- impl iterable refiter(@a) -> @a#
- impl iterable chunkiter(@a) -> @a[:]
-
- generic byzip : (a : @a[:], b : @b[:] -> zipiter(@a, @b))
- generic byenum : (a : @a[:] -> enumiter(@a))
- generic byreverse : (sl : @a[:] -> reverseiter(@a))
- generic byref : (sl : @a[:] -> refiter(@a))
- generic bychunk : (a : @a[:], chunk : size -> chunkiter(@a))
-;;
-
-generic byzip = {a, b
- -> [.s1 = a, .s2 = b]
-}
-
-impl iterable zipiter(@a, @b) -> (@a, @b) =
- __iternext__ = {itp, valp
- if itp.s1.len > 0 && itp.s2.len > 0
- valp# = (itp.s1[0], itp.s2[0])
- itp.s1 = itp.s1[1:]
- itp.s2 = itp.s2[1:]
- -> true
- else
- -> false
- ;;
- }
-
- __iterfin__ = {itp, valp
- }
-;;
-
-generic byreverse = {sl
- -> [.sl = sl, .idx = sl.len]
-}
-
-impl iterable reverseiter(@a) -> @a =
- __iternext__ = {itp, valp
- if itp.idx > 0
- valp# = itp.sl[itp.idx - 1]
- itp.idx--
- -> true
- else
- -> false
- ;;
- }
-
- __iterfin__ = {itp, valp
- }
-;;
-
-generic byenum = {a
- -> [.sl = a, .idx = 0]
-}
-
-impl iterable enumiter(@a) -> (size, @a) =
- __iternext__ = {itp, valp
- if itp.idx == itp.sl.len
- -> false
- ;;
- valp# = (itp.idx, itp.sl[itp.idx])
- itp.idx++
- -> true
- }
-
- __iterfin__ = {itp, valp
- }
-;;
-
-generic byref = {a
- -> [.sl = a, .idx = 0]
-}
-
-impl iterable refiter(@a) -> @a# =
- __iternext__ = {itp, valp
- if itp.idx == itp.sl.len
- -> false
- ;;
- valp# = &itp.sl[itp.idx]
- itp.idx++
- -> true
- }
-
- __iterfin__ = {itp, valp
- }
-;;
-
-generic bychunk = {a, sz
- -> [.sl = a, .idx = 0, .blksz = sz]
-}
-
-impl iterable chunkiter(@a) -> @a[:] =
- __iternext__ = {itp, valp
- var len
-
- len = min(itp.blksz, itp.sl.len - itp.idx)
- if itp.idx + len == itp.sl.len
- -> false
- ;;
- valp# = itp.sl[itp.idx: itp.idx + len]
- itp.idx += itp.blksz
- -> true
- }
-
- __iterfin__ = {itp, valp
- }
-;;
-
--- a/lib/std/listen+posixy.myr
+++ b/lib/std/listen+posixy.myr
@@ -23,7 +23,6 @@
const announce : (ds : byte[:] -> result(announce#, byte[:]))
const aclose : (a : announce# -> void)
-
const accept : (a : announce# -> result(fd, byte[:]))
;;
--- a/lib/std/mktemp.myr
+++ b/lib/std/mktemp.myr
@@ -13,10 +13,10 @@
use "types"
pkg std =
- const mktemp : (base : byte[:], opt : fdopt, mode : int64 -> std.result((fd, byte[:]), errno))
- const mktempat : (dir : byte[:], base : byte[:], opt : fdopt, mode : int64 -> std.result((fd, byte[:]), errno))
- const mkdtemp : (base : byte[:], mode : int64 -> std.result(byte[:], errno))
- const mkdtempat : (dir : byte[:], base : byte[:], mode : int64 -> std.result(byte[:], errno))
+ const mktemp : (base : byte[:], opt : fdopt, mode : int64 -> std.result((fd, byte[:]), errno))
+ const mktempat : (dir : byte[:], base : byte[:], opt : fdopt, mode : int64 -> std.result((fd, byte[:]), errno))
+ const mkdtemp : (base : byte[:], mode : int64 -> std.result(byte[:], errno))
+ const mkdtempat : (dir : byte[:], base : byte[:], mode : int64 -> std.result(byte[:], errno))
const mktemppath : (base : byte[:] -> byte[:])
;;
--- a/lib/std/resolve+posixy.myr
+++ b/lib/std/resolve+posixy.myr
@@ -58,8 +58,8 @@
rtype : rectype
;;
- const resolve : (host : byte[:] -> result(hostinfo[:], resolveerr))
- const resolvemx : (host : byte[:] -> result(hostinfo[:], resolveerr))
+ const resolve : (host : byte[:] -> result(hostinfo[:], resolveerr))
+ const resolvemx : (host : byte[:] -> result(hostinfo[:], resolveerr))
const resolverec : (host : byte[:], t : rectype[:] -> result(hostinfo[:], resolveerr))
;;
--- a/lib/std/slpush.myr
+++ b/lib/std/slpush.myr
@@ -7,12 +7,12 @@
generic slpush = {sl, elt
/*
- slpush relies on implementation details
- of slgrow for efficiency. Because bucket
- sizes come in powers of two for all buckets
- <= 32k, and by powers of 1.5 for larger
- slices, this is effectively growing the
- slice by powers of two.
+ slpush relies on implementation details
+ of slgrow for efficiency. Because bucket
+ sizes come in powers of two for all buckets
+ <= 32k, and by powers of 1.5 for larger
+ slices, this is effectively growing the
+ slice by powers of two.
*/
slgrow(sl, sl#.len + 1)
sl#[sl#.len - 1] = elt
--- a/lib/std/slput.myr
+++ b/lib/std/slput.myr
@@ -3,8 +3,8 @@
use "die"
pkg std =
- generic slput : (sl : @a[:]#, idx : size, elt : @a -> @a[:])
- generic sldel : (sl : @a[:]#, idx : size -> @a[:])
+ generic slput : (sl : @a[:]#, idx : size, elt : @a -> @a[:])
+ generic sldel : (sl : @a[:]#, idx : size -> @a[:])
;;
generic slput = {sl, idx, elt
--- a/lib/std/slurp.myr
+++ b/lib/std/slurp.myr
@@ -7,8 +7,8 @@
use "types"
pkg std =
- const slurp : (path : byte[:] -> result(byte[:], errno))
- const fslurp : (path : fd -> result(byte[:], errno))
+ const slurp : (path : byte[:] -> result(byte[:], errno))
+ const fslurp : (path : fd -> result(byte[:], errno))
;;
const Bufstart = 4096
--- a/lib/std/test/iterutil.myr
+++ /dev/null
@@ -1,26 +1,0 @@
-use std
-
-const main = {
- var n
-
- n = 0
- for (x, i) : std.byenum([1,3,5,7,9][:])
- std.assert(x == n, "invalid enum idx {}", x)
- std.assert(i == n*2 + 1, "invalid enum val {}", i)
- n++
- ;;
-
- n = 0
- for (a, b) : std.byzip([0,2,4,6,8][:], [2,4][:])
- std.assert(a == n*2, "invalid val from a: {}", a)
- std.assert(b == n*2 + 2, "invalid val from b: {}", b)
- n++
- ;;
-
- n = 0
- for x : std.byreverse([3, 2, 1, 0][:])
- std.assert(x == n, "invalid reversed value {}, expected {}", x, n)
- n++
- ;;
-
-}
--- a/lib/std/try.myr
+++ b/lib/std/try.myr
@@ -3,10 +3,10 @@
use "fmt"
pkg std =
- generic try : (v : result(@a, @b) -> @a)
- generic tryv : (v : result(@a, @b), d : @a -> @a)
- generic get : (v : option(@a) -> @a)
- generic getv : (v : option(@a), d : @a -> @a)
+ generic try : (v : result(@a, @b) -> @a)
+ generic tryv : (v : result(@a, @b), d : @a -> @a)
+ generic get : (v : option(@a) -> @a)
+ generic getv : (v : option(@a), d : @a -> @a)
generic canget : (o : option(@a) -> bool)
;;
--- a/lib/std/varargs.myr
+++ b/lib/std/varargs.myr
@@ -6,12 +6,12 @@
pkg std =
type valist
- const vastart : (args : ...# -> valist)
- const vatype : (ap : valist# -> byte[:])
- const vabytes : (ap : valist# -> byte[:])
- const vaenter : (ap : valist# -> valist)
+ const vastart : (args : ...# -> valist)
+ const vatype : (ap : valist# -> byte[:])
+ const vabytes : (ap : valist# -> byte[:])
+ const vaenter : (ap : valist# -> valist)
const vaenterunion : (ap : valist#, elt : int32 -> valist)
- generic vanext : (ap : valist# -> @a)
+ generic vanext : (ap : valist# -> @a)
;;
type valist = struct
--- a/lib/std/writeall.myr
+++ b/lib/std/writeall.myr
@@ -14,10 +14,8 @@
sz = src.len
while src.len != 0
match std.write(fd, src)
- | `Ok n:
- src = src[n:]
- | `Err e:
- -> (sz - src.len, `Some e)
+ | `Ok n: src = src[n:]
+ | `Err e: -> (sz - src.len, `Some e)
;;
;;
-> (sz, `None)