diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 263c9e0..026b0d4 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -17,6 +17,7 @@
+
\ No newline at end of file
diff --git a/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/MainActivity.kt b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/MainActivity.kt
index e3abfcd..98a2c8d 100644
--- a/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/MainActivity.kt
+++ b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/MainActivity.kt
@@ -3,6 +3,7 @@ package com.danielecampogiani.androidfunctionalvalidation
import android.content.Intent
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
+import com.danielecampogiani.androidfunctionalvalidation.either.EitherActivity
import com.danielecampogiani.androidfunctionalvalidation.option.OptionActivity
import kotlinx.android.synthetic.main.activity_main.*
@@ -13,7 +14,15 @@ class MainActivity : AppCompatActivity() {
setContentView(R.layout.activity_main)
option_button.setOnClickListener {
- startActivity(Intent(this, OptionActivity::class.java))
+ start()
}
+
+ either_button.setOnClickListener({
+ start()
+ })
+ }
+
+ private inline fun start() {
+ startActivity(Intent(this, T::class.java))
}
}
diff --git a/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/either/EitherActivity.kt b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/either/EitherActivity.kt
new file mode 100644
index 0000000..cfe2294
--- /dev/null
+++ b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/either/EitherActivity.kt
@@ -0,0 +1,41 @@
+package com.danielecampogiani.androidfunctionalvalidation.either
+
+import android.arch.lifecycle.Observer
+import android.arch.lifecycle.ViewModelProviders
+import android.os.Bundle
+import android.support.v7.app.AppCompatActivity
+import android.widget.Toast
+import com.danielecampogiani.androidfunctionalvalidation.Data
+import com.danielecampogiani.androidfunctionalvalidation.R
+import kotlinx.android.synthetic.main.activity_input.*
+
+class EitherActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_input)
+
+ val viewModel = ViewModelProviders.of(this)[EitherViewModel::class.java]
+
+ signup_button.setOnClickListener {
+ viewModel.validate(email.text.toString(), number.text.toString())
+ }
+
+ viewModel.validation.observe(this, Observer {
+ it?.fold(this::handleLeft, this::handleRight)
+ })
+ }
+
+ private fun handleLeft(error: String) {
+ showMessage(error)
+ }
+
+ private fun handleRight(data: Data) {
+ val message = "Mail: ${data.mail} Phone: ${data.phone}"
+ showMessage(message)
+ }
+
+ private fun showMessage(message: String) {
+ Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/either/EitherViewModel.kt b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/either/EitherViewModel.kt
new file mode 100644
index 0000000..e8284ac
--- /dev/null
+++ b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/either/EitherViewModel.kt
@@ -0,0 +1,21 @@
+package com.danielecampogiani.androidfunctionalvalidation.either
+
+import android.arch.lifecycle.LiveData
+import android.arch.lifecycle.MutableLiveData
+import android.arch.lifecycle.ViewModel
+import com.danielecampogiani.androidfunctionalvalidation.Data
+import kategory.Either
+
+class EitherViewModel : ViewModel() {
+
+ private val mutableValidation: MutableLiveData> = MutableLiveData()
+
+ val validation: LiveData>
+ get() = mutableValidation
+
+
+ fun validate(mail: String, phoneNumber: String) {
+ mutableValidation.value = validateData(mail, phoneNumber)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/either/functions.kt b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/either/functions.kt
new file mode 100644
index 0000000..e4834e9
--- /dev/null
+++ b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/either/functions.kt
@@ -0,0 +1,26 @@
+package com.danielecampogiani.androidfunctionalvalidation.either
+
+import com.danielecampogiani.androidfunctionalvalidation.Data
+import com.danielecampogiani.androidfunctionalvalidation.validMail
+import com.danielecampogiani.androidfunctionalvalidation.validNumber
+import kategory.*
+
+fun validateData(mail: String, phoneNumber: String): Either {
+
+ return Either.applicative().map2(mail.optionMail(), phoneNumber.optionPhoneNumber()) {
+ Data(it.a, it.b)
+ }.ev()
+
+}
+
+private fun String.optionMail(): Either =
+ when {
+ validMail(this) -> this.right()
+ else -> "Invalid email".left()
+ }
+
+private fun String.optionPhoneNumber(): Either =
+ when {
+ validNumber(this) -> this.right()
+ else -> "Invalid phone number".left()
+ }
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 2917e10..a1bbbb4 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -18,4 +18,16 @@
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 35ef0bb..55301fb 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -5,4 +5,5 @@
Sign Up
Option
At least one field is wrong
+ Either