<!DOCTYPE html >
<html>
        <head>
<link rel="canonical" href="https://ignite.apache.org/releases/latest/scaladoc/scalar/org/apache/ignite/scalar/package.html" />


          <title>scalar - Ignite Scalar - org.apache.ignite.scalar</title>
          <meta name="description" content="scalar - Ignite Scalar - org.apache.ignite.scalar" />
          <meta name="keywords" content="scalar Ignite Scalar org.apache.ignite.scalar" />
          <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
          
      <link href="../../../../lib/template.css" media="screen" type="text/css" rel="stylesheet" />
      <link href="../../../../lib/diagrams.css" media="screen" type="text/css" rel="stylesheet" id="diagrams-css" />
      <script type="text/javascript" src="../../../../lib/jquery.js" id="jquery-js"></script>
      <script type="text/javascript" src="../../../../lib/jquery-ui.js"></script>
      <script type="text/javascript" src="../../../../lib/template.js"></script>
      <script type="text/javascript" src="../../../../lib/tools.tooltip.js"></script>
      
      <script type="text/javascript">
         if(top === self) {
            var url = '../../../../index.html';
            var hash = 'org.apache.ignite.scalar.package';
            var anchor = window.location.hash;
            var anchor_opt = '';
            if (anchor.length >= 1)
              anchor_opt = '@' + anchor.substring(1);
            window.location.href = url + '#' + hash + anchor_opt;
         }
   	  </script>
    
        <link rel='shortcut icon' href='https://ignite.apache.org/favicon.ico'/>

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-61232409-1', 'auto');
  ga('send', 'pageview');

</script></head>

        <body class="value">
      <div id="definition">
        <img alt="Package" src="../../../../lib/package_big.png" />
        <p id="owner"><a href="../../../package.html" class="extype" name="org">org</a>.<a href="../../package.html" class="extype" name="org.apache">apache</a>.<a href="../package.html" class="extype" name="org.apache.ignite">ignite</a></p>
        <h1>scalar</h1><span class="permalink">
      <a href="../../../../index.html#org.apache.ignite.scalar.package" title="Permalink" target="_top">
        <img src="../../../../lib/permalink.png" alt="Permalink" />
      </a>
    </span>
      </div>

      <h4 id="signature" class="signature">
      <span class="modifier_kind">
        <span class="modifier"></span>
        <span class="kind">package</span>
      </span>
      <span class="symbol">
        <span class="name">scalar</span>
      </span>
      </h4>
      
          <div id="comment" class="fullcommenttop"></div>
        

      <div id="mbrsel">
        <div id="textfilter"><span class="pre"></span><span class="input"><input id="mbrsel-input" type="text" accesskey="/" /></span><span class="post"></span></div>
        
        
        <div id="visbl">
            <span class="filtertype">Visibility</span>
            <ol><li class="public in"><span>Public</span></li><li class="all out"><span>All</span></li></ol>
          </div>
      </div>

      <div id="template">
        <div id="allMembers">
        

        <div id="types" class="types members">
              <h3>Type Members</h3>
              <ol><li name="org.apache.ignite.scalar.ScalarConversions" visbl="pub" data-isabs="true" fullComment="yes" group="Ungrouped">
      <a id="ScalarConversionsextendsAnyRef"></a>
      <a id="ScalarConversions:ScalarConversions"></a>
      <h4 class="signature">
      <span class="modifier_kind">
        <span class="modifier"></span>
        <span class="kind">trait</span>
      </span>
      <span class="symbol">
        <a href="ScalarConversions.html"><span class="name">ScalarConversions</span></a><span class="result"> extends <span class="extype" name="scala.AnyRef">AnyRef</span></span>
      </span>
      </h4><span class="permalink">
      <a href="../../../../index.html#org.apache.ignite.scalar.package@ScalarConversionsextendsAnyRef" title="Permalink" target="_top">
        <img src="../../../../lib/permalink.png" alt="Permalink" />
      </a>
    </span>
      <p class="shortcomment cmt">Mixin for <code>scalar</code> object providing <code>implicit</code> and <code>explicit</code> conversions between
Java and Scala Ignite components.</p><div class="fullcomment"><div class="comment cmt"><h4>Overview</h4><p>Mixin for <code>scalar</code> object providing <code>implicit</code> and <code>explicit</code> conversions between
Java and Scala Ignite components.</p><p>It is very important to review this class as it defines what <code>implicit</code> conversions
will take place when using Scalar. Note that object <code>scalar</code> mixes in this
trait and therefore brings with it all implicits into the scope.
</p></div></div>
    </li></ol>
            </div>

        

        <div id="values" class="values members">
              <h3>Value Members</h3>
              <ol><li name="org.apache.ignite.scalar.lang" visbl="pub" data-isabs="false" fullComment="no" group="Ungrouped">
      <a id="lang"></a>
      <a id="lang:lang"></a>
      <h4 class="signature">
      <span class="modifier_kind">
        <span class="modifier"></span>
        <span class="kind">package</span>
      </span>
      <span class="symbol">
        <a href="lang/package.html"><span class="name">lang</span></a>
      </span>
      </h4><span class="permalink">
      <a href="../../../../index.html#org.apache.ignite.scalar.package@lang" title="Permalink" target="_top">
        <img src="../../../../lib/permalink.png" alt="Permalink" />
      </a>
    </span>
      <p class="shortcomment cmt">Contains Scala side adapters for implicits conversion.</p>
    </li><li name="org.apache.ignite.scalar.pimps" visbl="pub" data-isabs="false" fullComment="no" group="Ungrouped">
      <a id="pimps"></a>
      <a id="pimps:pimps"></a>
      <h4 class="signature">
      <span class="modifier_kind">
        <span class="modifier"></span>
        <span class="kind">package</span>
      </span>
      <span class="symbol">
        <a href="pimps/package.html"><span class="name">pimps</span></a>
      </span>
      </h4><span class="permalink">
      <a href="../../../../index.html#org.apache.ignite.scalar.package@pimps" title="Permalink" target="_top">
        <img src="../../../../lib/permalink.png" alt="Permalink" />
      </a>
    </span>
      <p class="shortcomment cmt">Contains Scala &quot;Pimp&quot; implementations for main Ignite entities.</p>
    </li><li name="org.apache.ignite.scalar.scalar" visbl="pub" data-isabs="false" fullComment="yes" group="Ungrouped">
      <a id="scalar"></a>
      <a id="scalar:scalar"></a>
      <h4 class="signature">
      <span class="modifier_kind">
        <span class="modifier"></span>
        <span class="kind">object</span>
      </span>
      <span class="symbol">
        <a href="scalar$.html"><span class="name">scalar</span></a><span class="result"> extends <a href="ScalarConversions.html" class="extype" name="org.apache.ignite.scalar.ScalarConversions">ScalarConversions</a></span>
      </span>
      </h4><span class="permalink">
      <a href="../../../../index.html#org.apache.ignite.scalar.package@scalar" title="Permalink" target="_top">
        <img src="../../../../lib/permalink.png" alt="Permalink" />
      </a>
    </span>
      <p class="shortcomment cmt"></p><div class="fullcomment"><div class="comment cmt"><p></p><pre>________               ______                    ______   _______
__  ___/_____________ ____  /______ _________    __/__ \  __  __ \
_____ \ _  ___/_  __ `/__  / _  __ `/__  ___/    ____/ /  _  / / /
____/ / / /__  / /_/ / _  /  / /_/ / _  /        _  __/___/ /_/ /
/____/  \___/  \__,_/  /_/   \__,_/  /_/         /____/_(_)____/</pre><h4>Overview</h4><p><code>scalar</code> is the main object that encapsulates Scalar DSL. It includes global functions
on &quot;scalar&quot; keyword, helper converters as well as necessary implicit conversions. <code>scalar</code> also
mimics many methods in <code>Ignite</code> class from Java side.</p><p>The idea behind Scalar DSL - <b>zero additional logic and only conversions</b> implemented
using Scala &quot;Pimp&quot; pattern. Note that most of the Scalar DSL development happened on Java
side of Ignite 3.0 product line - Java APIs had to be adjusted quite significantly to
support natural adaptation of functional APIs. That basically means that all functional
logic must be available on Java side and Scalar only provides conversions from Scala
language constructs to Java constructs. Note that currently Ignite supports Scala 2.8
and up only.</p><p>This design approach ensures that Java side does not starve and usage paradigm
is mostly the same between Java and Scala - yet with full power of Scala behind.
In other words, Scalar only adds Scala specifics, but not greatly altering semantics
of how Ignite APIs work. Most of the time the code in Scalar can be written in
Java in almost the same number of lines.</p><h4>Suffix '$' In Names</h4><p>Symbol <code>$</code> is used in names when they conflict with the names in the base Java class
that Scala pimp is shadowing or with Java package name that your Scala code is importing.
Instead of giving two different names to the same function we've decided to simply mark
Scala's side method with <code>$</code> suffix.</p><h4>Importing</h4><p>Scalar needs to be imported in a proper way so that necessary objects and implicit
conversions got available in the scope:
<pre name="code" class="scala">
import org.apache.ignite.scalar._
import scalar._
</pre>
This way you import object <code>scalar</code> as well as all methods declared or inherited in that
object as well.</p><h4>Examples</h4><p>Here are few short examples of how Scalar can be used to program routine distributed
task. All examples below use default Ignite configuration and default grid. All these
examples take an implicit advantage of auto-discovery and failover, load balancing and
collision resolution, zero deployment and many other underlying technologies in the
Ignite - while remaining absolutely distilled to the core domain logic.</p><p>This code snippet prints out full topology:
<pre name="code" class="scala">
scalar {
    grid$ foreach (n => println("Node: " + n.id8))
}
</pre>
The obligatory example - cloud enabled <code>Hello World!</code>. It splits the phrase
into multiple words and prints each word on a separate grid node:
<pre name="code" class="scala">
scalar {
    grid$ *< (SPREAD, (for (w <- "Hello World!".split(" ")) yield () => println(w)))
}
</pre>
This example broadcasts message to all nodes:
<pre name="code" class="scala">
scalar {
    grid$ *< (BROADCAST, () => println("Broadcasting!!!"))
}
</pre>
This example &quot;greets&quot; remote nodes only (note usage of Java-side closure):
<pre name="code" class="scala">
scalar {
    val me = grid$.localNode.id
    grid$.remoteProjection() *< (BROADCAST, F.println("Greetings from: " + me))
}
</pre></p><p>Next example creates a function that calculates lengths of the string
using MapReduce type of processing by splitting the input string into
multiple substrings, calculating each substring length on the remote
node and aggregating results for the final length of the original string:
<pre name="code" class="scala">
def count(msg: String) =
    grid$ @< (SPREAD, for (w <- msg.split(" ")) yield () => w.length, (s: Seq[Int]) => s.sum)
</pre>
This example shows a simple example of how Scalar can be used to work with in-memory data grid:
<pre name="code" class="scala">
scalar {
    val t = cache$[Symbol, Double]("partitioned")
    t += ('symbol -> 2.0)
    t -= ('symbol)
}
</pre>
</p></div></div>
    </li></ol>
            </div>

        

        
        </div>

        <div id="inheritedMembers">
        
        
        </div>

        <div id="groupedMembers">
        <div class="group" name="Ungrouped">
              <h3>Ungrouped</h3>
              
            </div>
        </div>

      </div>

      <div id="tooltip"></div>

      <div id="footer">  </div>


    </body>
      </html>
