Skip to content

Commit

Permalink
Merge pull request #2 from dcampogiani/feature/either
Browse files Browse the repository at this point in the history
Either implementation
  • Loading branch information
dcampogiani committed Dec 9, 2017
2 parents ba68518 + 55f14bd commit 308630f
Show file tree
Hide file tree
Showing 7 changed files with 112 additions and 1 deletion.
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
</intent-filter>
</activity>
<activity android:name=".option.OptionActivity" />
<activity android:name=".either.EitherActivity" />
</application>

</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -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.*

Expand All @@ -13,7 +14,15 @@ class MainActivity : AppCompatActivity() {
setContentView(R.layout.activity_main)

option_button.setOnClickListener {
startActivity(Intent(this, OptionActivity::class.java))
start<OptionActivity>()
}

either_button.setOnClickListener({
start<EitherActivity>()
})
}

private inline fun <reified T> start() {
startActivity(Intent(this, T::class.java))
}
}
Original file line number Diff line number Diff line change
@@ -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()
}
}
Original file line number Diff line number Diff line change
@@ -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<Either<String, Data>> = MutableLiveData()

val validation: LiveData<Either<String, Data>>
get() = mutableValidation


fun validate(mail: String, phoneNumber: String) {
mutableValidation.value = validateData(mail, phoneNumber)
}

}
Original file line number Diff line number Diff line change
@@ -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<String, Data> {

return Either.applicative<String>().map2(mail.optionMail(), phoneNumber.optionPhoneNumber()) {
Data(it.a, it.b)
}.ev()

}

private fun String.optionMail(): Either<String, String> =
when {
validMail(this) -> this.right()
else -> "Invalid email".left()
}

private fun String.optionPhoneNumber(): Either<String, String> =
when {
validNumber(this) -> this.right()
else -> "Invalid phone number".left()
}
12 changes: 12 additions & 0 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,16 @@
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<android.support.v7.widget.AppCompatButton
android:id="@+id/either_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:backgroundTint="@color/primary"
android:text="@string/either"
android:textColor="@color/icons"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/option_button" />

</android.support.constraint.ConstraintLayout>
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@
<string name="sign_up">Sign Up</string>
<string name="option" translatable="false">Option</string>
<string name="option_wrong">At least one field is wrong</string>
<string name="either" translatable="false">Either</string>
</resources>

0 comments on commit 308630f

Please sign in to comment.