Skip to content

Instantly share code, notes, and snippets.

@gahabeen
Last active May 1, 2020 08:17
Show Gist options
  • Save gahabeen/df6a1433c054c589ffdc90d4471e6226 to your computer and use it in GitHub Desktop.
Save gahabeen/df6a1433c054c589ffdc90d4471e6226 to your computer and use it in GitHub Desktop.
Example of a TypeOf FQL method based on composition with Let(<array>)

Example of a TypeOf FQL method based on composition with Let()

Composition with Let({}, expr)

What Let does in the background is actually splitting the object you give as the first parameter into a list of single-keyed object. That's partly why you can do this:

Let(
  {
    title: 'Mr',
    name: 'Doe',
    titledName: Concat([Var('title'), Var('name')], ' '),
  },
  Var('titledName')
)

What is really handled by Fauna is:

Let(
  [
    { title: 'Mr' },
    { name: 'Doe' },
    { titledName: Concat([Var('title'), Var('name')], ' ')}
  ],
  Var('titledName')
)

Thus why you can call a key within the same object (declared above).

What Paul Paterson discovered and shared on the slack is that you can do composition too.

If you declare the Let with an array as the first parameter instead of an object it's simply gonna process it as usual.

If instead of putting each one of your variables you put always the same one, you'll be able to:

  • read the previous one
  • reassign it to a new value

Hope it helped! G.

import { query as q, Expr } from 'faunadb';
export function TypeOf(value: Expr) {
return q.Let(
{
value,
type: q.Let(
[
{ t: null },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsArray(q.Var('value')), 'array', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsBoolean(q.Var('value')), 'boolean', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsBytes(q.Var('value')), 'bytes', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsCollection(q.Var('value')), 'collection', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsCredentials(q.Var('value')), 'credentials', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsDatabase(q.Var('value')), 'database', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsDate(q.Var('value')), 'date', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsDoc(q.Var('value')), 'doc', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsFunction(q.Var('value')), 'function', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsIndex(q.Var('value')), 'index', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsInteger(q.Var('value')), 'integer', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsDouble(q.Var('value')), 'double', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsKey(q.Var('value')), 'key', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsLambda(q.Var('value')), 'lambda', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsNull(q.Var('value')), 'null', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsNumber(q.Var('value')), 'number', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsObject(q.Var('value')), 'object', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsRef(q.Var('value')), 'ref', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsRole(q.Var('value')), 'role', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsSet(q.Var('value')), 'set', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsString(q.Var('value')), 'string', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsTimestamp(q.Var('value')), 'timestamp', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsToken(q.Var('value')), 'token', q.Var('t'))) },
],
q.Var('t'),
),
},
q.Var('type'),
);
}
q.Let(
{
value: <PUT YOUR VALUE HERE>,
type: q.Let(
[
{ t: null },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsArray(q.Var('value')), 'array', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsBoolean(q.Var('value')), 'boolean', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsBytes(q.Var('value')), 'bytes', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsCollection(q.Var('value')), 'collection', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsCredentials(q.Var('value')), 'credentials', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsDatabase(q.Var('value')), 'database', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsDate(q.Var('value')), 'date', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsDoc(q.Var('value')), 'doc', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsFunction(q.Var('value')), 'function', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsIndex(q.Var('value')), 'index', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsInteger(q.Var('value')), 'integer', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsDouble(q.Var('value')), 'double', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsKey(q.Var('value')), 'key', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsLambda(q.Var('value')), 'lambda', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsNull(q.Var('value')), 'null', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsNumber(q.Var('value')), 'number', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsObject(q.Var('value')), 'object', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsRef(q.Var('value')), 'ref', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsRole(q.Var('value')), 'role', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsSet(q.Var('value')), 'set', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsString(q.Var('value')), 'string', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsTimestamp(q.Var('value')), 'timestamp', q.Var('t'))) },
{ t: q.If(q.IsString(q.Var('t')), q.Var('t'), q.If(q.IsToken(q.Var('value')), 'token', q.Var('t'))) },
],
q.Var('t'),
),
},
q.Var('type'),
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment