@@ -0,0 +1,41 @@
1+module Builder
2+( Builder
3+)
4+where
5+
6+import Data.ArrayBuffer.Types
7+
8+type PutM m a = forall m a. (MonadEffect m) => WriterT Builder m a
9+type Put = PutM Effect Unit
10+ -- Note: use liftEffect to call the ArrayBuffer Effect functions
11+
12+-- | Builder for `ArrayBuffer`s.
13+-- |
14+-- | It is common to build an `ArrayBuffer` by issuing a sequence of `tell`
15+-- | commands in a `WriterT Builder IO` monad.
16+-- |
17+-- | *O(1)* `mappend` and *O(1)* `snoc` and *O(n)* `fold`.
18+data Builder
19+ = Node ArrayBuffer Builder Builder
20+ | Null
21+
22+instance semigroupBuilder :: Semigroup Builder where
23+ append Null Null = Null
24+ append l Null = l
25+ append Null r = r
26+ append (Node lx ll lr) (Node rx rl rr) = Node lx (Node )
27+
28+-- data Builder
29+-- = Tree (Nullable Builder) (Nullable Builder)
30+-- | Leaf ArrayBuffer
31+--
32+-- instance semigroupBuilder :: Semigroup Builder where
33+-- append
34+
35+data Builder
36+ = Tree Builder Builder
37+ | Snoc Builder ArrayBuffer
38+ | Nil
39+
40+-- Note use `censor` instead of `tell` to accumulate, so we don't have to make
41+-- a dummy List and then strip it off.