/* Copyright 2017 Andrew Dawson * * This file is a part of Tusky. * * This program is free software; you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details. * * You should have received a copy of the GNU General Public License along with Tusky; if not, * see . */ package com.keylesspalace.tusky.util /** * Created by charlag on 05/11/17. * * Class to represent sum type/tagged union/variant/ADT e.t.c. * It is either Left or Right. */ sealed class Either { data class Left(val value: L) : Either() data class Right(val value: R) : Either() fun isRight() = this is Right fun isLeft() = this is Left fun asLeftOrNull() = (this as? Left)?.value fun asRightOrNull() = (this as? Right)?.value fun asLeft(): L = (this as Left).value fun asRight(): R = (this as Right).value inline fun map(crossinline mapper: (R) -> N): Either { return if (this.isLeft()) { Left(this.asLeft()) } else { Right(mapper(this.asRight())) } } }