@@ -65,13 +65,11 @@ import Data.Set as Set
65import Data.Traversable (traverse)
65import Data.Traversable (traverse)
66import Data.Tuple.Nested (type (/\), (/\))
66import Data.Tuple.Nested (type (/\), (/\))
67import Data.URL (URL, addSegment)
67import Data.URL (URL, addSegment)
69import Effect.Aff (Aff, bracket, error, throwError)
68import Effect.Aff (Aff, bracket, error, throwError)
70import Effect.Aff.HTTP (Method(..), fetch)
69import Effect.Aff.HTTP (Method(..), fetch)
71import Effect.Aff.HTTP.Request as Request
70import Effect.Aff.HTTP.Request as Request
72import Effect.Aff.HTTP.Response (Response)
71import Effect.Aff.HTTP.Response (Response)
73import Effect.Aff.HTTP.Response as Response
72import Effect.Aff.HTTP.Response as Response
74−import Effect.Class.Console (log)
75import Foreign (Foreign, unsafeFromForeign, unsafeToForeign)
73import Foreign (Foreign, unsafeFromForeign, unsafeToForeign)
76import Foreign.Object (Object)
74import Foreign.Object (Object)
77import Foreign.Object as Object
75import Foreign.Object as Object
@@ -94,7 +92,7 @@ data Expr
95instance EncodeJson Expr where
93instance EncodeJson Expr where
96 encodeJson = case _ of
94 encodeJson = case _ of
97− Lit l -> encodeJson l
95+ Lit l -> l
98 Join x y -> encodeJson { join: [ x, y ] }
96 Join x y -> encodeJson { join: [ x, y ] }
99 Union x y -> encodeJson { union: [ x, y ] }
97 Union x y -> encodeJson { union: [ x, y ] }
100 Project proj expr -> encodeJson { proj: { proj: proj, expr: expr } }
98 Project proj expr -> encodeJson { proj: { proj: proj, expr: expr } }
@@ -118,14 +116,8 @@ class LiteralRelation r fields | r -> fields where
118instance (RowList.RowToList fields fields', Relatable fields fields') => LiteralRelation (Array (Record fields)) fields where
116instance (RowList.RowToList fields fields', Relatable fields fields') => LiteralRelation (Array (Record fields)) fields where
119 lit r = Rel $ Lit $ encodeJson { lit: { attrs: attributeTypes @fields @fields', vals: encodeRelation @fields @fields' <$> r } }
117 lit r = Rel $ Lit $ encodeJson { lit: { attrs: attributeTypes @fields @fields', vals: encodeRelation @fields @fields' <$> r } }
121−else instance
119+else instance (LiteralRelation (Record fields) fields, Newtype r (Record fields)) => LiteralRelation r fields where
122− ( Newtype r (Record fields)
123− , LiteralRelation (Array (Record field)) fields
124− , RowToList fields fields'
125− , Relatable fields fields'
127− LiteralRelation (Array r) fields where
128− lit = map unwrap >>> lit
120+ lit = unwrap >>> lit
130rel :: forall @rel fields. Newtype rel (Record fields) => RelVar rel => Rel fields
122rel :: forall @rel fields. Newtype rel (Record fields) => RelVar rel => Rel fields
131rel = Rel $ RelationVariable (relVar @rel)
123rel = Rel $ RelationVariable (relVar @rel)
@@ -482,7 +474,7 @@ define
482 => Transaction Unit
474 => Transaction Unit
483define = Transaction $ ReaderT $ \{ conn: Connection c, sess } -> do
475define = Transaction $ ReaderT $ \{ conn: Connection c, sess } -> do
484 fetch POST (c `addSegment` "transaction" `addSegment` sessionString sess)
476 fetch POST (c `addSegment` "transaction" `addSegment` sessionString sess)
485− { body: Request.json $ jsonToForeign $ encodeJson { define: { name: relVar @rel, attrs: attributeTypes @fields @fields' } } }
477+ { body: Request.json { define: { name: relVar @rel, attrs: Object.fromFoldable (attributeTypes @fields @fields') } } }
486 >>= Response.guardStatusOk
478 >>= Response.guardStatusOk
487 pure unit
479 pure unit
@@ -493,9 +485,8 @@ insert
493 => Rel fields
485 => Rel fields
494 -> Transaction Unit
486 -> Transaction Unit
495insert (Rel r) = Transaction $ ReaderT $ \{ conn: Connection c, sess } -> do
487insert (Rel r) = Transaction $ ReaderT $ \{ conn: Connection c, sess } -> do
496− traceM $ jsonToForeign $ encodeJson { insert: { name: relVar @rel, rel: r } }
497 fetch POST (c `addSegment` "transaction" `addSegment` sessionString sess)
488 fetch POST (c `addSegment` "transaction" `addSegment` sessionString sess)
498− { body: Request.json $ jsonToForeign $ encodeJson { insert: { name: relVar @rel, rel: r } } }
489+ { body: Request.json { insert: { name: relVar @rel, rel: jsonToForeign (encodeJson r) } } }
499 >>= Response.guardStatusOk
490 >>= Response.guardStatusOk
500 pure unit
491 pure unit
@@ -507,7 +498,7 @@ query
507 -> Transaction (Array (Record fields))
498 -> Transaction (Array (Record fields))
508query (Rel r) = Transaction $ ReaderT $ \{ conn: Connection c, sess } -> do
499query (Rel r) = Transaction $ ReaderT $ \{ conn: Connection c, sess } -> do
509 resp <- fetch POST (c `addSegment` "transaction" `addSegment` sessionString sess)
500 resp <- fetch POST (c `addSegment` "transaction" `addSegment` sessionString sess)
510− { body: Request.json $ jsonToForeign $ encodeJson { query: r } }
501+ { body: Request.json { query: jsonToForeign (encodeJson r) } }
511 Response.guardStatusOk resp
502 Response.guardStatusOk resp
512 j <- json resp
503 j <- json resp
513 case decodeRelation @fields @fields' j of
504 case decodeRelation @fields @fields' j of
@@ -519,8 +510,7 @@ decodeRelation
519 . BuildRelation fields fields'
510 . BuildRelation fields fields'
521 -> Either JsonDecodeError (Array (Record fields))
512 -> Either JsonDecodeError (Array (Record fields))
522−decodeRelation j = do
523− decodeRelationJson j >>= traverse (decodeRelationFromObject @fields @fields')
513+decodeRelation j = decodeRelationJson j >>= traverse (decodeRelationFromObject @fields @fields')
525jsonToForeign :: Json -> Foreign
515jsonToForeign :: Json -> Foreign
526jsonToForeign = unsafeCoerce
516jsonToForeign = unsafeCoerce