packages feed

sqel-0.0.1.0: test/Sqel/Test/Bug.hs

{-# options_ghc -fconstraint-solver-iterations=10 #-}

module Sqel.Test.Bug where

import Sqel.Comp (Column)
import Sqel.Data.Codec (FullCodec)
import Sqel.Data.Dd (Dd, DdType, type (:>) ((:>)))
import Sqel.Data.QuerySchema (QuerySchema)
import Sqel.Merge (merge)
import Sqel.Names (named)
import Sqel.Prim (prim, prims)
import Sqel.Product (prod)
import Sqel.Query (checkQuery)
import Sqel.ReifyCodec (reifyCodec)
import Sqel.Type (Merge, Prim, Prod, type (*>), type (>))

data Wrap a = Wrap { w :: a }
  deriving stock (Eq, Show, Generic)

data Wrap2 a = Wrap2 { id :: Text, w :: a }
  deriving stock (Eq, Show, Generic)

type DdWrap d s = Prod (Wrap d) *> Merge s

type DdWrap2 s = (Prod (Wrap2 (DdType s))) *> Prim "id" Text > Merge s

ddWrap2 ::
  ∀ d s merged .
  merged ~ Merge s =>
  Column d "w" merged merged =>
  Dd s ->
  Dd (DdWrap2 (DdWrap d s))
ddWrap2 w =
  prod (prim :> merge (prod (merge w)))

data Bug =
  Bug {
    a :: Int,
    b :: Int,
    c :: Int,
    d :: Int,
    e :: Int
  }
  deriving stock (Eq, Show, Generic)

type DdBug =
  Prod Bug *>
    Prim "a" Int >
    Prim "b" Int >
    Prim "c" Int >
    Prim "d" Int >
    Prim "e" Int

data WrapBug =
  WrapBug { w :: Bug }
  deriving stock (Eq, Show, Generic)

type DdWrapBug =
  Prod WrapBug *> Merge DdBug

type DdWrap2WrapBug =
  DdWrap2 DdWrapBug

ddBug :: Dd DdBug
ddBug =
  prod prims

ddWrapBug :: Dd DdWrapBug
ddWrapBug =
  prod (merge ddBug)

ddUidWrapBug :: Dd DdWrap2WrapBug
ddUidWrapBug =
  prod (prim :> merge ddWrapBug)

ddWrapWrapBug :: Dd (DdWrap2 (DdWrap WrapBug DdWrapBug))
ddWrapWrapBug =
  ddWrap2 ddWrapBug

schemaUidWrapBug :: FullCodec (Wrap2 WrapBug)
schemaUidWrapBug =
  reifyCodec ddUidWrapBug

schemaWrapWrapBug :: FullCodec (Wrap2 (Wrap WrapBug))
schemaWrapWrapBug =
  reifyCodec ddWrapWrapBug

queryUidWrapBug :: QuerySchema Int (Wrap2 WrapBug)
queryUidWrapBug =
  checkQuery (named @"a" prim) ddUidWrapBug