Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions src/main/java/co/ivi/jus/error/review/songor/UseCase.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/*
* Copyright (c) 2021, songor. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*/

package co.ivi.jus.error.review.songor;

import co.ivi.jus.error.union.Digest;
import co.ivi.jus.error.union.Returned;

public class UseCase {
public static void main(String[] args) {
Returned<Digest> rt = Digest.of("SHA-256");
if (rt instanceof Returned.ReturnValue rv && rv.returnValue() instanceof Digest d) {
d.digest("Hello, world!".getBytes());
} else if (rt instanceof Returned.ErrorCode ec) {
System.out.println("Failed to get instance of SHA-256");
} else {
// 不能使用 switch 模式匹配(穷举出所有的情景)而带来的不便之处
throw new UnsupportedOperationException("Invalid Returned instance");
}
}
}
36 changes: 36 additions & 0 deletions src/main/java/co/ivi/jus/flow/review/songor/UseCase.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
* Copyright (c) 2021, songor. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*/

package co.ivi.jus.flow.review.songor;

import co.ivi.jus.flow.reactive.Destination;
import co.ivi.jus.flow.reactive.Transform;

import java.util.concurrent.SubmissionPublisher;
import java.util.function.Function;

public class UseCase {
public static void main(String[] args) throws InterruptedException {
transform(new Event(3, 4), UseCase::calculate);
Thread.sleep(200);
}

public static void transform(Event event, Function<Event, Integer> function) {
SubmissionPublisher<Event> publisher = new SubmissionPublisher<>();
Transform<Event, Integer> transform = new Transform<>(function);
Destination<Integer> subscriber = new Destination<>(System.out::println);
publisher.subscribe(transform);
transform.subscribe(subscriber);
publisher.submit(event);
publisher.close();
}

public static int calculate(Event event) {
return (event.start() + event.duration() - 1) % 7;
}

public static record Event(int start, int duration) {
}
}
39 changes: 39 additions & 0 deletions src/main/java/co/ivi/jus/nullp/review/songor/FullName.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* Copyright (c) 2021, songor. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*/

package co.ivi.jus.nullp.review.songor;

public final class FullName {
private final String firstName;
private final String middleName;
private final String lastName;

public FullName(String firstName, String middleName, String lastName) {
this.firstName = firstName;
this.middleName = middleName;
this.lastName = lastName;
}

public Returned firstName() {
if (firstName == null) {
return Returned.ErrorCode.UNDEFINED;
}
return new Returned.ReturnValue<>(firstName);
}

public Returned middleName() {
if (middleName == null) {
return Returned.ErrorCode.UNDEFINED;
}
return new Returned.ReturnValue<>(middleName);
}

public Returned lastName() {
if (lastName == null) {
return Returned.ErrorCode.UNDEFINED;
}
return new Returned.ReturnValue<>(lastName);
}
}
15 changes: 15 additions & 0 deletions src/main/java/co/ivi/jus/nullp/review/songor/Returned.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/*
* Copyright (c) 2021, songor. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*/

package co.ivi.jus.nullp.review.songor;

public sealed interface Returned {
record ReturnValue<T>(T returnValue) implements Returned {
}

enum ErrorCode implements Returned {
UNDEFINED
}
}
35 changes: 35 additions & 0 deletions src/main/java/co/ivi/jus/nullp/review/songor/UseCase.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* Copyright (c) 2021, Xuelei Fan. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*/

package co.ivi.jus.nullp.review.songor;

public class UseCase {
public static void main(String[] args) {
FullName jack = new FullName("Jack", "", "Brown");
FullName rose = new FullName("Rose", null, "Brown");
FullName nova = new FullName("Nova", "Diane", "Brown");
System.out.println(
"Is Jack's middle name Diane? " +
hasMiddleName(jack, "Diane"));
System.out.println(
"Is Rose's middle name Diane? " +
hasMiddleName(rose, "Diane"));
System.out.println(
"Is Nova's middle name Diane? " +
hasMiddleName(nova, "Diane"));
}

private static boolean hasMiddleName(FullName fullName, String middleName) {
return switch (fullName.middleName()) {
case Returned.ErrorCode ec -> switch (ec) {
case UNDEFINED -> false;
};
case Returned.ReturnValue rv -> {
String returnedMiddleName = (String) rv.returnValue();
yield returnedMiddleName.equals(middleName);
}
};
}
}
47 changes: 47 additions & 0 deletions src/main/java/co/ivi/jus/stack/review/songor/Digest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/*
* Copyright (c) 2021, songor. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*/

package co.ivi.jus.stack.review.songor;

public sealed abstract class Digest {
private static final class SHA256 extends Digest {
@Override
public byte[] digest(byte[] message) {
// snipped
return new byte[0];
}
}

private static final class SHA512 extends Digest {
@Override
public byte[] digest(byte[] message) {
// snipped
return new byte[0];
}
}

public static Returned of(String algorithm) {
return switch (algorithm) {
case "SHA-256" -> new Returned.ReturnValue<Digest>(new SHA256());
case "SHA-512" -> new Returned.ReturnValue<Digest>(new SHA512());
case null -> {
System.getLogger("co.ivi.jus.stack.review.songor")
.log(System.Logger.Level.WARNING,
"No algorithm is specified",
new Throwable("the calling stack"));
yield Returned.ErrorCode.NO_SPECIFIED_ALGORITHM;
}
default -> {
System.getLogger("co.ivi.jus.stack.review.songor")
.log(System.Logger.Level.INFO,
"Unknown algorithm is specified " + algorithm,
new Throwable("the calling stack"));
yield Returned.ErrorCode.UNKNOWN_SPECIFIED_ALGORITHM;
}
};
}

public abstract byte[] digest(byte[] message);
}
15 changes: 15 additions & 0 deletions src/main/java/co/ivi/jus/stack/review/songor/Returned.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/*
* Copyright (c) 2021, songor. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*/

package co.ivi.jus.stack.review.songor;

public sealed interface Returned {
record ReturnValue<T>(T returnValue) implements Returned {
}

enum ErrorCode implements Returned {
NO_SPECIFIED_ALGORITHM, UNKNOWN_SPECIFIED_ALGORITHM
}
}
28 changes: 28 additions & 0 deletions src/main/java/co/ivi/jus/stack/review/songor/UseCase.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
* Copyright (c) 2021, songor. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*/

package co.ivi.jus.stack.review.songor;

public class UseCase {
public static void main(String[] args) {
Returned rt = Digest.of("SHA-128");
switch (rt) {
case Returned.ReturnValue rv -> {
Digest d = (Digest) rv.returnValue();
d.digest("Hello, world!".getBytes());
}
case Returned.ErrorCode ec -> {
switch (ec) {
case NO_SPECIFIED_ALGORITHM -> System.getLogger("co.ivi.jus.stack.review.songor")
.log(System.Logger.Level.INFO,
"Unlikely to happen");
case UNKNOWN_SPECIFIED_ALGORITHM -> System.getLogger("co.ivi.jus.stack.review.songor")
.log(System.Logger.Level.INFO,
"SHA-218 is not supported");
}
}
}
}
}