@@ -65,11 +65,13 @@ import Data.Set as Set
6565import Data.Traversable (traverse)
6666import Data.Tuple.Nested (type (/\), (/\))
6767import Data.URL (URL, addSegment)
68+import Debug (traceM)
6869import Effect.Aff (Aff, bracket, error, throwError)
6970import Effect.Aff.HTTP (Method(..), fetch)
7071import Effect.Aff.HTTP.Request as Request
7172import Effect.Aff.HTTP.Response (Response)
7273import Effect.Aff.HTTP.Response as Response
74+import Effect.Class.Console (log)
7375import Foreign (Foreign, unsafeFromForeign, unsafeToForeign)
7476import Foreign.Object (Object)
7577import Foreign.Object as Object
@@ -92,7 +94,7 @@ data Expr
9294
9395instance EncodeJson Expr where
9496 encodeJson = case _ of
95− Lit l -> l
97+ Lit l -> encodeJson l
9698 Join x y -> encodeJson { join: [ x, y ] }
9799 Union x y -> encodeJson { union: [ x, y ] }
98100 Project proj expr -> encodeJson { proj: { proj: proj, expr: expr } }
@@ -116,8 +118,14 @@ class LiteralRelation r fields | r -> fields where
116118instance (RowList.RowToList fields fields', Relatable fields fields') => LiteralRelation (Array (Record fields)) fields where
117119 lit r = Rel $ Lit $ encodeJson { lit: { attrs: attributeTypes @fields @fields', vals: encodeRelation @fields @fields' <$> r } }
118120
119−else instance (LiteralRelation (Record fields) fields, Newtype r (Record fields)) => LiteralRelation r fields where
120− lit = unwrap >>> lit
121+else instance
122+ ( Newtype r (Record fields)
123+ , LiteralRelation (Array (Record field)) fields
124+ , RowToList fields fields'
125+ , Relatable fields fields'
126+ ) =>
127+ LiteralRelation (Array r) fields where
128+ lit = map unwrap >>> lit
121129
122130rel :: forall @rel fields. Newtype rel (Record fields) => RelVar rel => Rel fields
123131rel = Rel $ RelationVariable (relVar @rel)
@@ -474,7 +482,7 @@ define
474482 => Transaction Unit
475483define = Transaction $ ReaderT $ \{ conn: Connection c, sess } -> do
476484 fetch POST (c `addSegment` "transaction" `addSegment` sessionString sess)
477− { body: Request.json { define: { name: relVar @rel, attrs: Object.fromFoldable (attributeTypes @fields @fields') } } }
485+ { body: Request.json $ jsonToForeign $ encodeJson { define: { name: relVar @rel, attrs: attributeTypes @fields @fields' } } }
478486 >>= Response.guardStatusOk
479487 pure unit
480488
@@ -485,8 +493,9 @@ insert
485493 => Rel fields
486494 -> Transaction Unit
487495insert (Rel r) = Transaction $ ReaderT $ \{ conn: Connection c, sess } -> do
496+ traceM $ jsonToForeign $ encodeJson { insert: { name: relVar @rel, rel: r } }
488497 fetch POST (c `addSegment` "transaction" `addSegment` sessionString sess)
489− { body: Request.json { insert: { name: relVar @rel, rel: jsonToForeign (encodeJson r) } } }
498+ { body: Request.json $ jsonToForeign $ encodeJson { insert: { name: relVar @rel, rel: r } } }
490499 >>= Response.guardStatusOk
491500 pure unit
492501
@@ -498,7 +507,7 @@ query
498507 -> Transaction (Array (Record fields))
499508query (Rel r) = Transaction $ ReaderT $ \{ conn: Connection c, sess } -> do
500509 resp <- fetch POST (c `addSegment` "transaction" `addSegment` sessionString sess)
501− { body: Request.json { query: jsonToForeign (encodeJson r) } }
510+ { body: Request.json $ jsonToForeign $ encodeJson { query: r } }
502511 Response.guardStatusOk resp
503512 j <- json resp
504513 case decodeRelation @fields @fields' j of
@@ -510,7 +519,8 @@ decodeRelation
510519 . BuildRelation fields fields'
511520 => Json
512521 -> Either JsonDecodeError (Array (Record fields))
513−decodeRelation j = decodeRelationJson j >>= traverse (decodeRelationFromObject @fields @fields')
522+decodeRelation j = do
523+ decodeRelationJson j >>= traverse (decodeRelationFromObject @fields @fields')
514524
515525jsonToForeign :: Json -> Foreign
516526jsonToForeign = unsafeCoerce