diff --git a/AlgebraicDataflowArchitectureModel/models/Algolike.model b/AlgebraicDataflowArchitectureModel/models/Algolike.model index ab7e747..97aef04 100644 --- a/AlgebraicDataflowArchitectureModel/models/Algolike.model +++ b/AlgebraicDataflowArchitectureModel/models/Algolike.model @@ -2,6 +2,8 @@ deck := nil handsA := nil handsB := nil + guessA := 0 + guessB := 0 } channel targetAInput{ out targetA(t:Int, setTargetA(a:Int)) == a @@ -21,6 +23,9 @@ channel guessBInput{ out guessB(t:Int, setGuessB(b:Int)) == b } +channel addDeck{ + out deck(d:List, addCard(num:Integer)) == cons(tuple(num, false), d) +} channel drawAInput{ diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java index 1f6adab..0260695 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java @@ -36,35 +36,35 @@ public static final Symbol cons = new Symbol("cons", 2, Symbol.Type.PREFIX, "($x,$y)->$x.add(0, $y)", Symbol.Type.LAMBDA_WITH_SIDE_EFFECT, new int[] {1, 0}); public static final Symbol head = new Symbol("head", 1, Symbol.Type.PREFIX, "($x)->$x.get(0)", Symbol.Type.LAMBDA); public static final Symbol tail = new Symbol("tail", 1, Symbol.Type.PREFIX, "($x)->$x.subList(1, $x.size())", Symbol.Type.LAMBDA); - public static final Symbol extractFaceDown = new Symbol("extractFaceDown", 1, Symbol.Type.PREFIX, new Symbol.IImplGenerator() { - @Override - public String generate(Type type, String[] children, String[] childrenSideEffects, String[] sideEffect) { - return children[0]+".stream().filter(item -> item.getValue()==false).collect(Collectors.toList())"; - } - }); - public static final Symbol sortByKey = new Symbol("sortByKey", 1, Symbol.Type.PREFIX, new Symbol.IImplGenerator() { - @Override - public String generate(Type type, String[] children, String[] childrenSideEffects, String[] sideEffect) { - String compType = ""; - String temp_sort="temp_sort"; - if (type != null) { - String interfaceType = type.getInterfaceTypeName(); - if (interfaceType.contains("<")) { - compType = interfaceType.substring(interfaceType.indexOf("<") + 1, interfaceType.lastIndexOf(">")); - } - String implType = type.getImplementationTypeName(); - if (implType.indexOf('<') >= 0) { - implType = implType.substring(0, implType.indexOf('<')); - } - - } - for (String s: childrenSideEffects) { - sideEffect[0] += s; - } - temp_sort=children[0]+".sort(Comparator.comparing("+compType+"::getKey));\n"; - return temp_sort; - } - },true); +// public static final Symbol extractFaceDown = new Symbol("extractFaceDown", 1, Symbol.Type.PREFIX, new Symbol.IImplGenerator() { +// @Override +// public String generate(Type type, String[] children, String[] childrenSideEffects, String[] sideEffect) { +// return children[0]+".stream().filter(item -> item.getValue()==false).collect(Collectors.toList())"; +// } +// }); +// public static final Symbol sortByKey = new Symbol("sortByKey", 1, Symbol.Type.PREFIX, new Symbol.IImplGenerator() { +// @Override +// public String generate(Type type, String[] children, String[] childrenSideEffects, String[] sideEffect) { +// String compType = ""; +// String temp_sort="temp_sort"; +// if (type != null) { +// String interfaceType = type.getInterfaceTypeName(); +// if (interfaceType.contains("<")) { +// compType = interfaceType.substring(interfaceType.indexOf("<") + 1, interfaceType.lastIndexOf(">")); +// } +// String implType = type.getImplementationTypeName(); +// if (implType.indexOf('<') >= 0) { +// implType = implType.substring(0, implType.indexOf('<')); +// } +// +// } +// for (String s: childrenSideEffects) { +// sideEffect[0] += s; +// } +// temp_sort=children[0]+".sort(Comparator.comparing("+compType+"::getKey));\n"; +// return temp_sort; +// } +// },true); public static final Symbol length = new Symbol("length", 1, Symbol.Type.PREFIX, "($x)->$x.size()", Symbol.Type.LAMBDA); public static final Symbol get = new Symbol("get", 2, Symbol.Type.PREFIX, "get", Symbol.Type.METHOD); public static final Symbol set = new Symbol("set", 3, Symbol.Type.PREFIX, "set", Symbol.Type.METHOD_WITH_SIDE_EFFECT); @@ -183,8 +183,8 @@ cons.setInverses(new Symbol[] {head, tail}); cons.setSignature(new Type[] {typeList, null, typeList}); contains.setSignature(new Type[] {typeBoolean, typeList, null}); - extractFaceDown.setSignature(new Type[] {typeList, null}); - sortByKey.setSignature(new Type[] {typeList, typeList}); + //extractFaceDown.setSignature(new Type[] {typeList, null}); + //sortByKey.setSignature(new Type[] {typeList, typeList}); length.setSignature(new Type[] {typeInt, null}); get.setSignature(new Type[] {null, typeList, typeInt}); set.setSignature(new Type[] {typeList, typeList, typeInt, null}); @@ -237,9 +237,9 @@ addSymbol(cons); addSymbol(head); addSymbol(tail); - addSymbol(extractFaceDown); + //addSymbol(extractFaceDown); addSymbol(length); - addSymbol(sortByKey); + //addSymbol(sortByKey); addSymbol(contains); addSymbol(get); addSymbol(set); diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ModelExtension.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ModelExtension.java index 0666fa2..8438c7b 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ModelExtension.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ModelExtension.java @@ -8,6 +8,8 @@ private static Symbol.Memento floorMem; private static Symbol.Memento sumMem; private static Symbol.Memento mergeMem; + private static Symbol.Memento extractFaceDownMem; + private static Symbol.Memento sortByKeyMem; public static void extendModel(DataFlowModel model) { Symbol floor = model.getSymbol("floor"); @@ -100,6 +102,52 @@ merge.setImplOperatorType(Symbol.Type.GENERATIVE); merge.setSignature(new Type[] {DataConstraintModel.typeList, DataConstraintModel.typeList, DataConstraintModel.typeList}); } + Symbol extractFaceDown = model.getSymbol("extractFaceDown"); + extractFaceDownMem = null; + if (extractFaceDown != null) { + extractFaceDownMem = extractFaceDown.createMemento(); + extractFaceDown.setArity(1); + extractFaceDown.setGenerator(new Symbol.IImplGenerator() { + @Override + public String generate(Type type, String[] children, String[] childrenSideEffects, String[] sideEffect) { + return children[0]+".stream().filter(item -> item.getValue()==false).collect(Collectors.toList())"; + } + }); + extractFaceDown.setImplOperatorType(Symbol.Type.GENERATIVE); + extractFaceDown.setSignature(new Type[] {DataConstraintModel.typeList, null}); + } + + Symbol sortByKey = model.getSymbol("sortByKey"); + sortByKeyMem = null; + if(sortByKey != null) { + sortByKeyMem = sortByKey.createMemento(); + sortByKey.setArity(1); + sortByKey.setGenerator(new Symbol.IImplGenerator() { + @Override + public String generate(Type type, String[] children, String[] childrenSideEffects, String[] sideEffect) { + String compType = ""; + String temp_sort="temp_sort"; + if (type != null) { + String interfaceType = type.getInterfaceTypeName(); + if (interfaceType.contains("<")) { + compType = interfaceType.substring(interfaceType.indexOf("<") + 1, interfaceType.lastIndexOf(">")); + } + String implType = type.getImplementationTypeName(); + if (implType.indexOf('<') >= 0) { + implType = implType.substring(0, implType.indexOf('<')); + } + + } + for (String s: childrenSideEffects) { + sideEffect[0] += s; + } + temp_sort=children[0]+".sort(Comparator.comparing("+compType+"::getKey));\n"; + return temp_sort; + } + }); + sortByKey.setSignature(new Type[] {DataConstraintModel.typeList, DataConstraintModel.typeList}); + sortByKey.setImplOperatorType(Symbol.Type.GENERATIVE); + } } public static void recoverModel(DataFlowModel model) { @@ -109,5 +157,7 @@ if (sum != null) sum.setMemento(sumMem); Symbol merge = model.getSymbol("merge"); if (merge != null) merge.setMemento(mergeMem); + Symbol extractFaceDown = model.getSymbol("extractFaceDown"); + if (extractFaceDown != null) extractFaceDown.setMemento(extractFaceDownMem); } }