package input
Input molecules awaiting input.
Input molecules are molecules that awaits one or more inputs at runtime. When input value is applied,
the input molecule is resolved and a standard molecule is returned that we can then call actions on.
Input molecule queries are cached by Datomic. So there is a runtime performance gain in using input molecules. Furthermore,
input molecules are a good fit for re-use for queries where only a few parameters change.
Input molecules can await 1, 2 or 3 inputs and are constructed by applying the ? marker
to attributes. If one marker is applied, we get a InputMolecule_1, 2 inputs creates
an InputMolecule_2 and 3 an InputMolecule_3.
The three input molecule interfaces come in arity-versions corresponding to the number of non-?-marked attributes
in the input molecule. Let's see a simple example:
// Sample data Person.name.age insert List(("Ben", 42), ("Liz", 34)) // Input molecule created at compile time. Awaits a name of type String val ageOfPersons: InputMolecule_1.InputMolecule_1_01[String, Int] = m(Person.name_(?).age) // Resolved molecule. "Ben" input is matched against name attribute val ageOfPersonsNamedBen: Molecule.Molecule01[Int] = ageOfPersons.apply("Ben") // Calling action on resolved molecule. // (Only age is returned since name was marked as tacit with the underscore notation) ageOfPersonsNamedBen.get === List(42) // Or we can re-use the input molecule straight away ageOfPersons("Liz").get === List(34)
- Source
- package.scala
- Alphabetic
- By Inheritance
- input
- AnyRef
- Any
- Hide All
- Show All
- Public
- Protected
Type Members
- trait InputMolecule extends MoleculeBase
Shared interface of all input molecules.
Shared interface of all input molecules.
Input molecules are molecules that awaits one or more inputs at runtime. When input value is applied, the input molecule is resolved and a standard molecule is returned that we can then call actions on.
Input molecule queries are cached by Datomic. So there is a runtime performance gain in using input molecules. Furthermore, input molecules are a good fit for re-use for queries where only a few parameters change.
Input molecules can await 1, 2 or 3 inputs and are constructed by applying the ? marker to attributes. If one marker is applied, we get a InputMolecule_1, 2 inputs creates an InputMolecule_3 and 3 an InputMolecule_3.
The three input molecule interfaces come in arity-versions corresponding to the number of non-?-marked attributes in the input molecule. Let's see a simple example:// Sample data Person.name.age insert List( ("Joe", 42), ("Liz", 34) ) // Input molecule created at compile time. Awaits a name of type String val ageOfPersons: InputMolecule_1.InputMolecule_1_01[String, Int] = m(Person.name_(?).age) // Resolved molecule. "Joe" input is matched against name attribute val ageOfPersonsNamedJoe: Molecule.Molecule01[Int] = ageOfPersons.apply("Joe") // Calling action on resolved molecule. // (Only age is returned since name was marked as tacit with the underscore notation) ageOfPersonsNamedJoe.get === List(42) // Or we can re-use the input molecule straight away ageOfPersons("Liz").get === List(34)
- See also
- trait InputMolecule_1[I1] extends InputMolecule
Shared interfaces of input molecules awaiting 1 input.
Shared interfaces of input molecules awaiting 1 input.
// Sample data set Person.name.age insert List( ("Joe", 42), ("Liz", 34) ) // Input molecule awaiting 1 input for `name` val ageOfPersons = m(Person.name_(?).age) // Resolve input molecule with name input in various ways ageOfPersons("Joe").get === List(42) ageOfPersons("Joe", "Liz").get === List(42, 34) ageOfPersons("Joe" or "Liz").get === List(42, 34) ageOfPersons(Seq("Joe", "Liz")).get === List(42, 34)
- I1
Type of input matching attribute with
?
marker
- See also
- trait InputMolecule_2[I1, I2] extends InputMolecule
Shared interfaces of input molecules awaiting 2 inputs.
Shared interfaces of input molecules awaiting 2 inputs.
// Sample data set Person.name.profession.age insert List( ("Ann", "doctor", 37), ("Ben", "teacher", 37), ("Joe", "teacher", 32), ("Liz", "teacher", 28) ) // Input molecule awaiting 2 inputs for `profession` and `age` val profAge = m(Person.name.profession_(?).age_(?)) // A. Pairs of input ................................. // One pair as params profAge("doctor", 37).get === List("Ann") // One or more pairs profAge(("doctor", 37)).get === List("Ann") profAge(("doctor", 37), ("teacher", 37)).get.sorted === List("Ann", "Ben") // One or more logical pairs // [pair-expression] or [pair-expression] or ... profAge(("doctor" and 37) or ("teacher" and 32)).get.sorted === List("Ann", "Joe") profAge(Seq(("doctor", 37), ("teacher", 37))).get.sorted === List("Ann", "Ben") // List of pairs profAge(Seq(("doctor", 37))).get === List("Ann") // B. 2 groups of input, one for each input attribute ................................. // Two expressions // [profession-expression] and [age-expression] profAge("doctor" and 37).get === List("Ann") profAge(("doctor" or "teacher") and 37).get.sorted === List("Ann", "Ben") profAge(("doctor" or "teacher") and (32 or 28)).get.sorted === List("Joe", "Liz") // Two Lists profAge(Seq("doctor"), Seq(37)).get === List("Ann") profAge(Seq("doctor", "teacher"), Seq(37)).get.sorted === List("Ann", "Ben") profAge(Seq("teacher"), Seq(37, 32)).get.sorted === List("Ben", "Joe") profAge(Seq("doctor", "teacher"), Seq(37, 32)).get.sorted === List("Ann", "Ben", "Joe")
- I1
Type of input matching first attribute with
?
marker (profession: String)- I2
Type of input matching second attribute with
?
marker (age: Int)
- See also
- trait InputMolecule_3[I1, I2, I3] extends InputMolecule
Shared interfaces of input molecules awaiting 3 inputs.
Shared interfaces of input molecules awaiting 3 inputs.
// Sample data set Person.name.profession.age.score insert List( ("Ann", "doctor", 37, 1.0), ("Ben", "teacher", 37, 1.0), ("Joe", "teacher", 32, 1.0), ("Liz", "teacher", 28, 2.0) ) // Input molecule awaiting 3 inputs for `profession`, `age` and `score` val profAgeScore = m(Person.name.profession_(?).age_(?).score_(?)) // A. Triples of input ................................. // One triple as params profAgeScore.apply("doctor", 37, 1.0).get === List("Ann") // One or more triples profAgeScore.apply(("doctor", 37, 1.0)).get === List("Ann") profAgeScore.apply(("doctor", 37, 1.0), ("teacher", 37, 1.0)).get.sorted === List("Ann", "Ben") // One or more logical triples // [triple-expression] or [triple-expression] or ... profAgeScore.apply(("doctor" and 37 and 1.0) or ("teacher" and 32 and 1.0)).get.sorted === List("Ann", "Joe") // List of triples profAgeScore.apply(Seq(("doctor", 37, 1.0))).get === List("Ann") profAgeScore.apply(Seq(("doctor", 37, 1.0), ("teacher", 37, 1.0))).get.sorted === List("Ann", "Ben") // B. 3 groups of input, one for each input attribute ................................. // Three expressions // [profession-expression] and [age-expression] and [score-expression] profAgeScore.apply("doctor" and 37 and 1.0).get === List("Ann") profAgeScore.apply(("doctor" or "teacher") and 37 and 1.0).get.sorted === List("Ann", "Ben") profAgeScore.apply(("doctor" or "teacher") and (37 or 32) and 1.0).get.sorted === List("Ann", "Ben", "Joe") profAgeScore.apply(("doctor" or "teacher") and (37 or 32) and (1.0 or 2.0)).get.sorted === List("Ann", "Ben", "Joe") // Three lists profAgeScore.apply(Seq("doctor"), Seq(37), Seq(1.0)).get === List("Ann") profAgeScore.apply(Seq("doctor", "teacher"), Seq(37), Seq(1.0)).get.sorted === List("Ann", "Ben")
- I1
Type of input matching first attribute with
?
marker (profession: String)- I2
Type of input matching second attribute with
?
marker (age: Int)- I3
Type of input matching third attribute with
?
marker (score: Double)
- See also
Value Members
- object InputMolecule_1
Implementations of input molecules awaiting 1 input, output arity 1-22
- object InputMolecule_2
Implementations of input molecules awaiting 2 inputs, output arity 1-22
- object InputMolecule_3
Implementations of input molecules awaiting 3 inputs, output arity 1-22
Documentation/API for the Molecule library - a meta DSL for the Datomic database.
Manual | scalamolecule.org | Github | Forum