use of suite.util.FunUtil.Source in project suite by stupidsing.
the class ProveTracer method expandWithTrace.
public Node expandWithTrace(Node query, Prover prover, Iterate<Node> expand) {
Node query1 = new Cloner().clone(query);
if (currentDepth < 64) {
Record record0 = currentRecord;
int depth0 = currentDepth;
Record record = new Record(record0, query1, currentDepth + 1);
Data<Source<Boolean>> enter = new Data<>(() -> {
currentRecord = record;
currentDepth = record.depth;
record.start = records.size();
records.add(record);
return Boolean.TRUE;
});
Data<Source<Boolean>> leaveOk = new Data<>(() -> {
currentRecord = record0;
currentDepth = depth0;
record.nOkays++;
return Boolean.TRUE;
});
Data<Source<Boolean>> leaveFail = new Data<>(() -> {
currentRecord = record0;
currentDepth = depth0;
record.end = records.size();
return Boolean.FALSE;
});
Node alt = prover.getAlternative();
Node rem = prover.getRemaining();
prover.setAlternative(Tree.of(TermOp.OR____, leaveFail, alt));
prover.setRemaining(Tree.of(TermOp.AND___, leaveOk, rem));
query = expand.apply(query);
query = Tree.of(TermOp.AND___, enter, query);
} else
query = expand.apply(query);
return query;
}
use of suite.util.FunUtil.Source in project suite by stupidsing.
the class Prover method prove0.
public boolean prove0(Node query) {
rem = OK;
alt = FAIL;
while (true) {
// logUtil.info(Formatter.dump(query));
query = query.finalNode();
if (query instanceof Tree) {
Tree tree = (Tree) query;
Node left = tree.getLeft(), right = tree.getRight();
switch((TermOp) tree.getOperator()) {
case OR____:
int pit = trail.getPointInTime();
Node bt = new Data<Source<Boolean>>(() -> {
trail.unwind(pit);
return Boolean.TRUE;
});
alt = andTree(bt, orTree(andTree(right, rem), alt));
query = left;
continue;
case AND___:
rem = andTree(right, rem);
query = left;
continue;
case EQUAL_:
query = isSuccess(bind(left, right));
break;
default:
}
} else if (query instanceof Data) {
query = isSuccess(Data.<Source<Boolean>>get(query).source());
continue;
}
Boolean b = systemPredicates.call(query);
if (b != null)
query = isSuccess(b);
// not handled above
if (query == OK)
if (rem != OK) {
query = rem;
rem = OK;
} else
return true;
else if (query == FAIL)
if (alt != FAIL) {
query = alt;
alt = FAIL;
rem = OK;
} else
return false;
else {
boolean isTrace = config.isTrace();
if (isTrace) {
Set<String> whites = Suite.tracePredicates;
Set<String> blacks = Suite.noTracePredicates;
Prototype prototype = Prototype.of(query);
Node head = prototype != null ? prototype.head : null;
Atom atom = head instanceof Atom ? (Atom) head : null;
String name = atom != null ? atom.name : null;
isTrace &= whites == null || whites.contains(name);
isTrace &= blacks == null || !blacks.contains(name);
}
if (!isTrace)
query = expand(query);
else
query = tracer.expandWithTrace(query, this, this::expand);
}
}
}
use of suite.util.FunUtil.Source in project suite by stupidsing.
the class NioDispatcherTest method testTextExchange.
@Test
public void testTextExchange() throws IOException {
String hello = "HELLO";
Charset charset = Constants.charset;
Source<NioChannel> source = () -> {
BufferedNioChannel channel = new BufferedNioChannel();
channel.onConnected.wire(sender -> {
String s = hello + "\n";
channel.send(To.bytes(s));
});
channel.onReceive.wire(channel::send);
return NioChannelFactory.buffered(channel);
};
NioDispatcher<NioChannel> dispatcher = new NioDispatcherImpl<>(source);
dispatcher.start();
try (Closeable closeServer = dispatcher.listen(5151);
Socket socket = new Socket("localhost", 5151);
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
InputStreamReader isr = new InputStreamReader(is, charset);
BufferedReader reader = new BufferedReader(isr);
PrintWriter writer = new PrintWriter(os)) {
String m = "testing nio";
writer.println(m);
writer.flush();
assertEquals(hello, reader.readLine());
assertEquals(m, reader.readLine());
} finally {
dispatcher.stop();
}
}
use of suite.util.FunUtil.Source in project suite by stupidsing.
the class LempelZivWelchTest method doTest.
private String doTest(String s0) {
byte[] bs = s0.getBytes(Constants.charset);
Source<Byte> source0 = new Source<>() {
private int index;
public Byte source() {
return index < bs.length ? bs[index++] : null;
}
};
LempelZivWelch<Byte> lzw = new LempelZivWelch<>(allBytes());
Source<Integer> source1 = lzw.encode(source0);
Source<Byte> source2 = lzw.decode(source1);
BytesBuilder bb = new BytesBuilder();
Byte b;
while ((b = source2.source()) != null) bb.append(b);
return To.string(bb.toBytes());
}
use of suite.util.FunUtil.Source in project suite by stupidsing.
the class DblFunUtil method suck.
/**
* Sucks data from a sink and produce into a source.
*/
public static DblSource suck(Sink<DblSink> fun) {
NullableSyncQueue<Double> queue = new NullableSyncQueue<>();
DblSink enqueue = c -> enqueue(queue, c);
Thread thread = Thread_.startThread(() -> {
try {
fun.sink(enqueue);
} finally {
enqueue(queue, EMPTYVALUE);
}
});
return () -> {
try {
return queue.take();
} catch (InterruptedException ex) {
thread.interrupt();
return Fail.t(ex);
}
};
}
Aggregations