     ///   - predicate: (Right) -> Bool
     ///   - default: Default error
     /// - Returns: ALEither<R, E>
-    func takeIf(predicate: (R) -> Bool, wrong: E) -> ALEither<R, E> {
+    public func takeIf(predicate: (R) -> Bool, wrong: E) -> ALEither<R, E> {
         switch self {
             case .right(let val): return predicate(val) ? self : .wrong(value: wrong)
             case .wrong: return self
         }
     }
     
-    func flatMap<U>(f: (R) -> ALEither<U, E>) -> ALEither<U, E> {
+    public func flatMap<U>(f: (R) -> ALEither<U, E>) -> ALEither<U, E> {
         switch self {
             case .right(let val): return  f(val)
             case .wrong(let err): return .wrong(value: err)

    /// - Parameter predicate: Predicate
    /// - Returns: ALEither<R, E>?
    
    func take(if predicate: (R) -> Bool) -> ALEither<R, E>? {
        switch self {
            case .right(let val): return predicate(val) ? self : nil
            case .wrong: return self

    /// - Parameter work: Block of work with error
    /// - Returns: ALEither<R, E>
    @discardableResult
    public func doIfWrong<U>(of type: U.Type, work: (U) -> Void) -> ALEither<R, E> {
        if case .wrong(let err) = self {
            if let e = err as? U {
                work(e)
