mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Merge branch 'master' into 817-updated
Conflicts: lib/linguist/samples.json
This commit is contained in:
		| @@ -632,6 +632,12 @@ Forth: | ||||
|   extensions: | ||||
|   - .4th | ||||
|  | ||||
| Frege: | ||||
|   type: programming | ||||
|   color: "#00cafe" | ||||
|   lexer: Haskell | ||||
|   primary_extension: .fr | ||||
|  | ||||
| Game Maker Language: | ||||
|   type: programming | ||||
|   lexer: JavaScript | ||||
|   | ||||
| @@ -135,6 +135,9 @@ | ||||
|       ".forth", | ||||
|       ".fth" | ||||
|     ], | ||||
|     "Frege": [ | ||||
|       ".fr" | ||||
|     ], | ||||
|     "Game Maker Language": [ | ||||
|       ".gml" | ||||
|     ], | ||||
| @@ -584,8 +587,8 @@ | ||||
|       ".gemrc" | ||||
|     ] | ||||
|   }, | ||||
|   "tokens_total": 471163, | ||||
|   "languages_total": 585, | ||||
|   "tokens_total": 476727, | ||||
|   "languages_total": 589, | ||||
|   "tokens": { | ||||
|     "ABAP": { | ||||
|       "*/**": 1, | ||||
| @@ -18164,6 +18167,787 @@ | ||||
|       "/cell": 2, | ||||
|       "cell": 2 | ||||
|     }, | ||||
|     "Frege": { | ||||
|       "module": 2, | ||||
|       "examples.CommandLineClock": 1, | ||||
|       "where": 39, | ||||
|       "data": 3, | ||||
|       "Date": 5, | ||||
|       "native": 4, | ||||
|       "java.util.Date": 1, | ||||
|       "new": 9, | ||||
|       "(": 339, | ||||
|       ")": 345, | ||||
|       "-": 730, | ||||
|       "IO": 13, | ||||
|       "MutableIO": 1, | ||||
|       "toString": 2, | ||||
|       "Mutable": 1, | ||||
|       "s": 21, | ||||
|       "ST": 1, | ||||
|       "String": 9, | ||||
|       "d.toString": 1, | ||||
|       "action": 2, | ||||
|       "to": 13, | ||||
|       "give": 2, | ||||
|       "us": 1, | ||||
|       "the": 20, | ||||
|       "current": 4, | ||||
|       "time": 1, | ||||
|       "as": 33, | ||||
|       "do": 38, | ||||
|       "d": 3, | ||||
|       "<->": 35, | ||||
|       "java": 5, | ||||
|       "lang": 2, | ||||
|       "Thread": 2, | ||||
|       "sleep": 4, | ||||
|       "takes": 1, | ||||
|       "a": 99, | ||||
|       "long": 4, | ||||
|       "and": 14, | ||||
|       "returns": 2, | ||||
|       "nothing": 2, | ||||
|       "but": 2, | ||||
|       "may": 1, | ||||
|       "throw": 1, | ||||
|       "an": 6, | ||||
|       "InterruptedException": 4, | ||||
|       "This": 2, | ||||
|       "is": 24, | ||||
|       "without": 1, | ||||
|       "doubt": 1, | ||||
|       "public": 1, | ||||
|       "static": 1, | ||||
|       "void": 2, | ||||
|       "millis": 1, | ||||
|       "throws": 4, | ||||
|       "Encoded": 1, | ||||
|       "in": 22, | ||||
|       "Frege": 1, | ||||
|       "argument": 1, | ||||
|       "type": 8, | ||||
|       "Long": 3, | ||||
|       "result": 11, | ||||
|       "does": 2, | ||||
|       "defined": 1, | ||||
|       "frege": 1, | ||||
|       "Lang": 1, | ||||
|       "main": 11, | ||||
|       "args": 2, | ||||
|       "forever": 1, | ||||
|       "print": 25, | ||||
|       "stdout.flush": 1, | ||||
|       "Thread.sleep": 4, | ||||
|       "examples.Concurrent": 1, | ||||
|       "import": 7, | ||||
|       "System.Random": 1, | ||||
|       "Java.Net": 1, | ||||
|       "URL": 2, | ||||
|       "Control.Concurrent": 1, | ||||
|       "C": 6, | ||||
|       "main2": 1, | ||||
|       "m": 2, | ||||
|       "<": 84, | ||||
|       "newEmptyMVar": 1, | ||||
|       "forkIO": 11, | ||||
|       "m.put": 3, | ||||
|       "replicateM_": 3, | ||||
|       "c": 33, | ||||
|       "m.take": 1, | ||||
|       "println": 25, | ||||
|       "example1": 1, | ||||
|       "putChar": 2, | ||||
|       "example2": 2, | ||||
|       "getLine": 2, | ||||
|       "case": 6, | ||||
|       "of": 32, | ||||
|       "Right": 6, | ||||
|       "n": 38, | ||||
|       "setReminder": 3, | ||||
|       "Left": 5, | ||||
|       "_": 60, | ||||
|       "+": 200, | ||||
|       "show": 24, | ||||
|       "L*n": 1, | ||||
|       "table": 1, | ||||
|       "mainPhil": 2, | ||||
|       "[": 120, | ||||
|       "fork1": 3, | ||||
|       "fork2": 3, | ||||
|       "fork3": 3, | ||||
|       "fork4": 3, | ||||
|       "fork5": 3, | ||||
|       "]": 116, | ||||
|       "mapM": 3, | ||||
|       "MVar": 3, | ||||
|       "1": 2, | ||||
|       "5": 1, | ||||
|       "philosopher": 7, | ||||
|       "Kant": 1, | ||||
|       "Locke": 1, | ||||
|       "Wittgenstein": 1, | ||||
|       "Nozick": 1, | ||||
|       "Mises": 1, | ||||
|       "return": 17, | ||||
|       "Int": 6, | ||||
|       "me": 13, | ||||
|       "left": 4, | ||||
|       "right": 4, | ||||
|       "g": 4, | ||||
|       "Random.newStdGen": 1, | ||||
|       "let": 8, | ||||
|       "phil": 4, | ||||
|       "tT": 2, | ||||
|       "g1": 2, | ||||
|       "Random.randomR": 2, | ||||
|       "L": 6, | ||||
|       "eT": 2, | ||||
|       "g2": 3, | ||||
|       "thinkTime": 3, | ||||
|       "*": 5, | ||||
|       "eatTime": 3, | ||||
|       "fl": 4, | ||||
|       "left.take": 1, | ||||
|       "rFork": 2, | ||||
|       "poll": 1, | ||||
|       "Just": 2, | ||||
|       "fr": 3, | ||||
|       "right.put": 1, | ||||
|       "left.put": 2, | ||||
|       "table.notifyAll": 2, | ||||
|       "Nothing": 2, | ||||
|       "table.wait": 1, | ||||
|       "inter": 3, | ||||
|       "catch": 2, | ||||
|       "getURL": 4, | ||||
|       "xx": 2, | ||||
|       "url": 1, | ||||
|       "URL.new": 1, | ||||
|       "con": 3, | ||||
|       "url.openConnection": 1, | ||||
|       "con.connect": 1, | ||||
|       "con.getInputStream": 1, | ||||
|       "typ": 5, | ||||
|       "con.getContentType": 1, | ||||
|       "stderr.println": 3, | ||||
|       "ir": 2, | ||||
|       "InputStreamReader.new": 2, | ||||
|       "fromMaybe": 1, | ||||
|       "charset": 2, | ||||
|       "unsupportedEncoding": 3, | ||||
|       "br": 4, | ||||
|       "BufferedReader": 1, | ||||
|       "getLines": 1, | ||||
|       "InputStream": 1, | ||||
|       "UnsupportedEncodingException": 1, | ||||
|       "InputStreamReader": 1, | ||||
|       "x": 45, | ||||
|       "x.catched": 1, | ||||
|       "ctyp": 2, | ||||
|       "charset=": 1, | ||||
|       "m.group": 1, | ||||
|       "SomeException": 2, | ||||
|       "Throwable": 1, | ||||
|       "m1": 1, | ||||
|       "MVar.newEmpty": 3, | ||||
|       "m2": 1, | ||||
|       "m3": 2, | ||||
|       "r": 7, | ||||
|       "catchAll": 3, | ||||
|       ".": 41, | ||||
|       "m1.put": 1, | ||||
|       "m2.put": 1, | ||||
|       "m3.put": 1, | ||||
|       "r1": 2, | ||||
|       "m1.take": 1, | ||||
|       "r2": 3, | ||||
|       "m2.take": 1, | ||||
|       "r3": 3, | ||||
|       "take": 13, | ||||
|       "ss": 8, | ||||
|       "mapM_": 5, | ||||
|       "putStrLn": 2, | ||||
|       "|": 62, | ||||
|       "x.getClass.getName": 1, | ||||
|       "y": 15, | ||||
|       "sum": 2, | ||||
|       "map": 49, | ||||
|       "length": 20, | ||||
|       "package": 2, | ||||
|       "examples.Sudoku": 1, | ||||
|       "Data.TreeMap": 1, | ||||
|       "Tree": 4, | ||||
|       "keys": 2, | ||||
|       "Data.List": 1, | ||||
|       "DL": 1, | ||||
|       "hiding": 1, | ||||
|       "find": 20, | ||||
|       "union": 10, | ||||
|       "Element": 6, | ||||
|       "Zelle": 8, | ||||
|       "set": 4, | ||||
|       "candidates": 18, | ||||
|       "Position": 22, | ||||
|       "Feld": 3, | ||||
|       "Brett": 13, | ||||
|       "for": 25, | ||||
|       "assumptions": 10, | ||||
|       "conclusions": 2, | ||||
|       "Assumption": 21, | ||||
|       "ISNOT": 14, | ||||
|       "IS": 16, | ||||
|       "derive": 2, | ||||
|       "Eq": 1, | ||||
|       "Ord": 1, | ||||
|       "instance": 1, | ||||
|       "Show": 1, | ||||
|       "p": 72, | ||||
|       "e": 15, | ||||
|       "pname": 10, | ||||
|       "e.show": 2, | ||||
|       "showcs": 5, | ||||
|       "cs": 27, | ||||
|       "joined": 4, | ||||
|       "Assumption.show": 1, | ||||
|       "elements": 12, | ||||
|       "all": 22, | ||||
|       "possible": 2, | ||||
|       "..": 1, | ||||
|       "positions": 16, | ||||
|       "rowstarts": 4, | ||||
|       "row": 20, | ||||
|       "starting": 3, | ||||
|       "colstarts": 3, | ||||
|       "column": 2, | ||||
|       "boxstarts": 3, | ||||
|       "box": 15, | ||||
|       "boxmuster": 3, | ||||
|       "pattern": 1, | ||||
|       "by": 3, | ||||
|       "adding": 1, | ||||
|       "upper": 2, | ||||
|       "position": 9, | ||||
|       "results": 1, | ||||
|       "real": 1, | ||||
|       "extract": 2, | ||||
|       "field": 9, | ||||
|       "getf": 16, | ||||
|       "f": 19, | ||||
|       "fs": 22, | ||||
|       "fst": 9, | ||||
|       "otherwise": 8, | ||||
|       "cell": 24, | ||||
|       "getc": 12, | ||||
|       "b": 113, | ||||
|       "snd": 20, | ||||
|       "compute": 5, | ||||
|       "list": 7, | ||||
|       "that": 18, | ||||
|       "belong": 3, | ||||
|       "same": 8, | ||||
|       "given": 3, | ||||
|       "z..": 1, | ||||
|       "z": 12, | ||||
|       "quot": 1, | ||||
|       "col": 17, | ||||
|       "mod": 3, | ||||
|       "ri": 2, | ||||
|       "div": 3, | ||||
|       "or": 15, | ||||
|       "depending": 1, | ||||
|       "on": 4, | ||||
|       "ci": 3, | ||||
|       "index": 3, | ||||
|       "middle": 2, | ||||
|       "check": 2, | ||||
|       "if": 5, | ||||
|       "candidate": 10, | ||||
|       "has": 2, | ||||
|       "exactly": 2, | ||||
|       "one": 2, | ||||
|       "member": 1, | ||||
|       "i.e.": 1, | ||||
|       "been": 1, | ||||
|       "solved": 1, | ||||
|       "single": 9, | ||||
|       "Bool": 2, | ||||
|       "true": 16, | ||||
|       "false": 13, | ||||
|       "unsolved": 10, | ||||
|       "rows": 4, | ||||
|       "cols": 6, | ||||
|       "boxes": 1, | ||||
|       "allrows": 8, | ||||
|       "allcols": 5, | ||||
|       "allboxs": 5, | ||||
|       "allrcb": 5, | ||||
|       "zip": 7, | ||||
|       "repeat": 3, | ||||
|       "containers": 6, | ||||
|       "PRINTING": 1, | ||||
|       "printable": 1, | ||||
|       "coordinate": 1, | ||||
|       "a1": 3, | ||||
|       "lower": 1, | ||||
|       "i9": 1, | ||||
|       "packed": 1, | ||||
|       "chr": 2, | ||||
|       "ord": 6, | ||||
|       "board": 41, | ||||
|       "printb": 4, | ||||
|       "p1line": 2, | ||||
|       "pfld": 4, | ||||
|       "line": 2, | ||||
|       "brief": 1, | ||||
|       "no": 4, | ||||
|       "some": 2, | ||||
|       "zs": 1, | ||||
|       "initial/final": 1, | ||||
|       "msg": 6, | ||||
|       "res012": 2, | ||||
|       "concatMap": 1, | ||||
|       "a*100": 1, | ||||
|       "b*10": 1, | ||||
|       "BOARD": 1, | ||||
|       "ALTERATION": 1, | ||||
|       "ACTIONS": 1, | ||||
|       "message": 1, | ||||
|       "about": 1, | ||||
|       "what": 1, | ||||
|       "done": 1, | ||||
|       "turnoff1": 3, | ||||
|       "i": 16, | ||||
|       "off": 11, | ||||
|       "nc": 7, | ||||
|       "head": 19, | ||||
|       "newb": 7, | ||||
|       "filter": 26, | ||||
|       "notElem": 7, | ||||
|       "turnoff": 11, | ||||
|       "turnoffh": 1, | ||||
|       "ps": 8, | ||||
|       "foldM": 2, | ||||
|       "toh": 2, | ||||
|       "setto": 3, | ||||
|       "cname": 4, | ||||
|       "nf": 2, | ||||
|       "SOLVING": 1, | ||||
|       "STRATEGIES": 1, | ||||
|       "reduce": 3, | ||||
|       "sets": 2, | ||||
|       "contains": 1, | ||||
|       "numbers": 1, | ||||
|       "already": 1, | ||||
|       "finds": 1, | ||||
|       "logs": 1, | ||||
|       "NAKED": 5, | ||||
|       "SINGLEs": 1, | ||||
|       "passing.": 1, | ||||
|       "sss": 3, | ||||
|       "each": 2, | ||||
|       "with": 15, | ||||
|       "more": 2, | ||||
|       "than": 2, | ||||
|       "fields": 6, | ||||
|       "are": 6, | ||||
|       "rcb": 16, | ||||
|       "elem": 16, | ||||
|       "collect": 1, | ||||
|       "remove": 3, | ||||
|       "from": 7, | ||||
|       "look": 10, | ||||
|       "number": 4, | ||||
|       "appears": 1, | ||||
|       "container": 9, | ||||
|       "this": 2, | ||||
|       "can": 9, | ||||
|       "go": 1, | ||||
|       "other": 2, | ||||
|       "place": 1, | ||||
|       "HIDDEN": 6, | ||||
|       "SINGLE": 1, | ||||
|       "hiddenSingle": 2, | ||||
|       "select": 1, | ||||
|       "containername": 1, | ||||
|       "FOR": 11, | ||||
|       "IN": 9, | ||||
|       "occurs": 5, | ||||
|       "PAIRS": 8, | ||||
|       "TRIPLES": 8, | ||||
|       "QUADS": 2, | ||||
|       "nakedPair": 4, | ||||
|       "t": 14, | ||||
|       "nm": 6, | ||||
|       "SELECT": 3, | ||||
|       "pos": 5, | ||||
|       "tuple": 2, | ||||
|       "name": 2, | ||||
|       "//": 8, | ||||
|       "u": 6, | ||||
|       "fold": 7, | ||||
|       "non": 2, | ||||
|       "outof": 6, | ||||
|       "tuples": 2, | ||||
|       "hit": 7, | ||||
|       "subset": 3, | ||||
|       "any": 3, | ||||
|       "hiddenPair": 4, | ||||
|       "minus": 2, | ||||
|       "uniq": 4, | ||||
|       "sort": 4, | ||||
|       "common": 4, | ||||
|       "bs": 7, | ||||
|       "undefined": 1, | ||||
|       "cannot": 1, | ||||
|       "happen": 1, | ||||
|       "because": 1, | ||||
|       "either": 1, | ||||
|       "empty": 4, | ||||
|       "not": 5, | ||||
|       "intersectionlist": 2, | ||||
|       "intersections": 2, | ||||
|       "reason": 8, | ||||
|       "reson": 1, | ||||
|       "cpos": 7, | ||||
|       "WHERE": 2, | ||||
|       "tail": 2, | ||||
|       "intersection": 1, | ||||
|       "we": 5, | ||||
|       "occurences": 1, | ||||
|       "XY": 2, | ||||
|       "Wing": 2, | ||||
|       "there": 6, | ||||
|       "exists": 6, | ||||
|       "A": 7, | ||||
|       "X": 5, | ||||
|       "Y": 4, | ||||
|       "B": 5, | ||||
|       "Z": 6, | ||||
|       "shares": 2, | ||||
|       "reasoning": 1, | ||||
|       "will": 4, | ||||
|       "be": 9, | ||||
|       "since": 1, | ||||
|       "indeed": 1, | ||||
|       "thus": 1, | ||||
|       "see": 1, | ||||
|       "xyWing": 2, | ||||
|       "rcba": 4, | ||||
|       "share": 1, | ||||
|       "b1": 11, | ||||
|       "b2": 10, | ||||
|       "&&": 9, | ||||
|       "||": 2, | ||||
|       "then": 1, | ||||
|       "else": 1, | ||||
|       "c1": 4, | ||||
|       "c2": 3, | ||||
|       "N": 5, | ||||
|       "Fish": 1, | ||||
|       "Swordfish": 1, | ||||
|       "Jellyfish": 1, | ||||
|       "When": 2, | ||||
|       "particular": 1, | ||||
|       "digit": 1, | ||||
|       "located": 2, | ||||
|       "only": 1, | ||||
|       "columns": 2, | ||||
|       "eliminate": 1, | ||||
|       "those": 2, | ||||
|       "which": 2, | ||||
|       "fish": 7, | ||||
|       "fishname": 5, | ||||
|       "rset": 4, | ||||
|       "certain": 1, | ||||
|       "rflds": 2, | ||||
|       "rowset": 1, | ||||
|       "colss": 3, | ||||
|       "must": 4, | ||||
|       "appear": 1, | ||||
|       "at": 3, | ||||
|       "least": 3, | ||||
|       "cstart": 2, | ||||
|       "immediate": 1, | ||||
|       "consequences": 6, | ||||
|       "assumption": 8, | ||||
|       "form": 1, | ||||
|       "conseq": 3, | ||||
|       "cp": 3, | ||||
|       "two": 1, | ||||
|       "contradict": 2, | ||||
|       "contradicts": 7, | ||||
|       "get": 3, | ||||
|       "aPos": 5, | ||||
|       "List": 1, | ||||
|       "turned": 1, | ||||
|       "when": 2, | ||||
|       "true/false": 1, | ||||
|       "toClear": 7, | ||||
|       "whose": 1, | ||||
|       "implications": 5, | ||||
|       "themself": 1, | ||||
|       "chain": 2, | ||||
|       "paths": 12, | ||||
|       "solution": 6, | ||||
|       "reverse": 4, | ||||
|       "css": 7, | ||||
|       "yields": 1, | ||||
|       "contradictory": 1, | ||||
|       "chainContra": 2, | ||||
|       "pro": 7, | ||||
|       "contra": 4, | ||||
|       "ALL": 2, | ||||
|       "conlusions": 1, | ||||
|       "uniqBy": 2, | ||||
|       "using": 2, | ||||
|       "sortBy": 2, | ||||
|       "comparing": 2, | ||||
|       "conslusion": 1, | ||||
|       "chains": 4, | ||||
|       "LET": 1, | ||||
|       "BE": 1, | ||||
|       "final": 2, | ||||
|       "conclusion": 4, | ||||
|       "THE": 1, | ||||
|       "FIRST": 1, | ||||
|       "implication": 2, | ||||
|       "ai": 2, | ||||
|       "so": 1, | ||||
|       "a0": 1, | ||||
|       "OR": 7, | ||||
|       "a2": 2, | ||||
|       "...": 2, | ||||
|       "IMPLIES": 1, | ||||
|       "For": 2, | ||||
|       "cells": 1, | ||||
|       "pi": 2, | ||||
|       "have": 1, | ||||
|       "construct": 2, | ||||
|       "p0": 1, | ||||
|       "p1": 1, | ||||
|       "c0": 1, | ||||
|       "cellRegionChain": 2, | ||||
|       "os": 3, | ||||
|       "cellas": 2, | ||||
|       "regionas": 2, | ||||
|       "iss": 3, | ||||
|       "ass": 2, | ||||
|       "first": 2, | ||||
|       "candidates@": 1, | ||||
|       "region": 2, | ||||
|       "oss": 2, | ||||
|       "Liste": 1, | ||||
|       "aller": 1, | ||||
|       "Annahmen": 1, | ||||
|       "ein": 1, | ||||
|       "bestimmtes": 1, | ||||
|       "acstree": 3, | ||||
|       "Tree.fromList": 1, | ||||
|       "bypass": 1, | ||||
|       "maybe": 1, | ||||
|       "tree": 1, | ||||
|       "lookup": 2, | ||||
|       "error": 1, | ||||
|       "performance": 1, | ||||
|       "resons": 1, | ||||
|       "confine": 1, | ||||
|       "ourselves": 1, | ||||
|       "20": 1, | ||||
|       "per": 1, | ||||
|       "mkPaths": 3, | ||||
|       "acst": 3, | ||||
|       "impl": 2, | ||||
|       "{": 1, | ||||
|       "a3": 1, | ||||
|       "ordered": 1, | ||||
|       "impls": 2, | ||||
|       "ns": 2, | ||||
|       "concat": 1, | ||||
|       "takeUntil": 1, | ||||
|       "null": 1, | ||||
|       "iterate": 1, | ||||
|       "expandchain": 3, | ||||
|       "avoid": 1, | ||||
|       "loops": 1, | ||||
|       "uni": 3, | ||||
|       "SOLVE": 1, | ||||
|       "SUDOKU": 1, | ||||
|       "Apply": 1, | ||||
|       "available": 1, | ||||
|       "strategies": 1, | ||||
|       "until": 1, | ||||
|       "changes": 1, | ||||
|       "anymore": 1, | ||||
|       "Strategy": 1, | ||||
|       "functions": 2, | ||||
|       "supposed": 1, | ||||
|       "applied": 1, | ||||
|       "changed": 1, | ||||
|       "board.": 1, | ||||
|       "strategy": 2, | ||||
|       "anything": 1, | ||||
|       "alter": 1, | ||||
|       "it": 2, | ||||
|       "next": 1, | ||||
|       "tried.": 1, | ||||
|       "solve": 19, | ||||
|       "res@": 16, | ||||
|       "apply": 17, | ||||
|       "res": 16, | ||||
|       "smallest": 1, | ||||
|       "comment": 16, | ||||
|       "SINGLES": 1, | ||||
|       "locked": 1, | ||||
|       "2": 3, | ||||
|       "QUADRUPELS": 6, | ||||
|       "3": 3, | ||||
|       "4": 3, | ||||
|       "WINGS": 1, | ||||
|       "FISH": 3, | ||||
|       "pcomment": 2, | ||||
|       "9": 5, | ||||
|       "forcing": 1, | ||||
|       "allow": 1, | ||||
|       "infer": 1, | ||||
|       "both": 1, | ||||
|       "brd": 2, | ||||
|       "com": 5, | ||||
|       "stderr": 3, | ||||
|       "<<": 4, | ||||
|       "log": 1, | ||||
|       "turn": 1, | ||||
|       "string": 3, | ||||
|       "into": 1, | ||||
|       "mkrow": 2, | ||||
|       "mkrow1": 2, | ||||
|       "xs": 4, | ||||
|       "make": 1, | ||||
|       "sure": 1, | ||||
|       "unpacked": 2, | ||||
|       "<=>": 1, | ||||
|       "0": 2, | ||||
|       "ignored": 1, | ||||
|       "h": 1, | ||||
|       "help": 1, | ||||
|       "usage": 1, | ||||
|       "Sudoku": 2, | ||||
|       "file": 4, | ||||
|       "81": 3, | ||||
|       "char": 1, | ||||
|       "consisting": 1, | ||||
|       "digits": 2, | ||||
|       "One": 1, | ||||
|       "such": 1, | ||||
|       "going": 1, | ||||
|       "http": 3, | ||||
|       "www": 1, | ||||
|       "sudokuoftheday": 1, | ||||
|       "pages": 1, | ||||
|       "o": 1, | ||||
|       "php": 1, | ||||
|       "click": 1, | ||||
|       "puzzle": 1, | ||||
|       "open": 1, | ||||
|       "tab": 1, | ||||
|       "Copy": 1, | ||||
|       "address": 1, | ||||
|       "your": 1, | ||||
|       "browser": 1, | ||||
|       "There": 1, | ||||
|       "also": 1, | ||||
|       "hard": 1, | ||||
|       "sudokus": 1, | ||||
|       "examples": 1, | ||||
|       "top95": 1, | ||||
|       "txt": 1, | ||||
|       "W": 1, | ||||
|       "felder": 2, | ||||
|       "decode": 4, | ||||
|       "files": 2, | ||||
|       "forM_": 1, | ||||
|       "sudoku": 2, | ||||
|       "openReader": 1, | ||||
|       "lines": 2, | ||||
|       "BufferedReader.getLines": 1, | ||||
|       "process": 5, | ||||
|       "candi": 2, | ||||
|       "consider": 3, | ||||
|       "acht": 4, | ||||
|       "neun": 2, | ||||
|       "examples.SwingExamples": 1, | ||||
|       "Java.Awt": 1, | ||||
|       "ActionListener": 2, | ||||
|       "Java.Swing": 1, | ||||
|       "rs": 2, | ||||
|       "Runnable.new": 1, | ||||
|       "helloWorldGUI": 2, | ||||
|       "buttonDemoGUI": 2, | ||||
|       "celsiusConverterGUI": 2, | ||||
|       "invokeLater": 1, | ||||
|       "tempTextField": 2, | ||||
|       "JTextField.new": 1, | ||||
|       "celsiusLabel": 1, | ||||
|       "JLabel.new": 3, | ||||
|       "convertButton": 1, | ||||
|       "JButton.new": 3, | ||||
|       "fahrenheitLabel": 1, | ||||
|       "frame": 3, | ||||
|       "JFrame.new": 3, | ||||
|       "frame.setDefaultCloseOperation": 3, | ||||
|       "JFrame.dispose_on_close": 3, | ||||
|       "frame.setTitle": 1, | ||||
|       "celsiusLabel.setText": 1, | ||||
|       "convertButton.setText": 1, | ||||
|       "convertButtonActionPerformed": 2, | ||||
|       "celsius": 3, | ||||
|       "getText": 1, | ||||
|       "double": 1, | ||||
|       "fahrenheitLabel.setText": 3, | ||||
|       "c*1.8": 1, | ||||
|       ".long": 1, | ||||
|       "ActionListener.new": 2, | ||||
|       "convertButton.addActionListener": 1, | ||||
|       "contentPane": 2, | ||||
|       "frame.getContentPane": 2, | ||||
|       "layout": 2, | ||||
|       "GroupLayout.new": 1, | ||||
|       "contentPane.setLayout": 1, | ||||
|       "TODO": 1, | ||||
|       "continue": 1, | ||||
|       "//docs.oracle.com/javase/tutorial/displayCode.html": 1, | ||||
|       "code": 1, | ||||
|       "//docs.oracle.com/javase/tutorial/uiswing/examples/learn/CelsiusConverterProject/src/learn/CelsiusConverterGUI.java": 1, | ||||
|       "frame.pack": 3, | ||||
|       "frame.setVisible": 3, | ||||
|       "label": 2, | ||||
|       "cp.add": 1, | ||||
|       "newContentPane": 2, | ||||
|       "JPanel.new": 1, | ||||
|       "JButton": 4, | ||||
|       "b1.setVerticalTextPosition": 1, | ||||
|       "SwingConstants.center": 2, | ||||
|       "b1.setHorizontalTextPosition": 1, | ||||
|       "SwingConstants.leading": 2, | ||||
|       "b2.setVerticalTextPosition": 1, | ||||
|       "b2.setHorizontalTextPosition": 1, | ||||
|       "b3": 7, | ||||
|       "Enable": 1, | ||||
|       "button": 1, | ||||
|       "setVerticalTextPosition": 1, | ||||
|       "SwingConstants": 2, | ||||
|       "center": 1, | ||||
|       "setHorizontalTextPosition": 1, | ||||
|       "leading": 1, | ||||
|       "setEnabled": 7, | ||||
|       "action1": 2, | ||||
|       "action3": 2, | ||||
|       "b1.addActionListener": 1, | ||||
|       "b3.addActionListener": 1, | ||||
|       "newContentPane.add": 3, | ||||
|       "newContentPane.setOpaque": 1, | ||||
|       "frame.setContentPane": 1 | ||||
|     }, | ||||
|     "Game Maker Language": { | ||||
|       "//draws": 1, | ||||
|       "the": 62, | ||||
| @@ -51296,6 +52080,7 @@ | ||||
|     "Erlang": 2928, | ||||
|     "fish": 636, | ||||
|     "Forth": 1516, | ||||
|     "Frege": 5564, | ||||
|     "Game Maker Language": 13310, | ||||
|     "GAS": 133, | ||||
|     "GLSL": 3766, | ||||
| @@ -51450,6 +52235,7 @@ | ||||
|     "Erlang": 5, | ||||
|     "fish": 3, | ||||
|     "Forth": 7, | ||||
|     "Frege": 4, | ||||
|     "Game Maker Language": 13, | ||||
|     "GAS": 1, | ||||
|     "GLSL": 3, | ||||
| @@ -51565,5 +52351,5 @@ | ||||
|     "Xtend": 2, | ||||
|     "YAML": 2 | ||||
|   }, | ||||
|   "md5": "54de8af8a3aae92fbbc0f1f71d1d7598" | ||||
|   "md5": "51294029c815b3d94cfcd55545a37a0c" | ||||
| } | ||||
							
								
								
									
										44
									
								
								samples/Frege/CommandLineClock.fr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								samples/Frege/CommandLineClock.fr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| {--  | ||||
|     This program displays the | ||||
|     current time on stdandard output | ||||
|     every other second. | ||||
|     -} | ||||
|      | ||||
| module examples.CommandLineClock where | ||||
|  | ||||
| data Date = native java.util.Date where | ||||
|     native new :: () -> IO (MutableIO Date)     -- new Date() | ||||
|     native toString :: Mutable s Date -> ST s String    -- d.toString() | ||||
|  | ||||
| --- 'IO' action to give us the current time as 'String' | ||||
| current :: IO String | ||||
| current = do | ||||
|     d <- Date.new () | ||||
|     d.toString | ||||
|  | ||||
| {-  | ||||
|     "java.lang.Thread.sleep" takes a "long" and | ||||
|     returns nothing, but may throw an InterruptedException. | ||||
|     This is without doubt an IO action. | ||||
|      | ||||
|     public static void sleep(long millis) | ||||
|                   throws InterruptedException | ||||
|      | ||||
|     Encoded in Frege: | ||||
|     - argument type  long   Long | ||||
|     - result         void   () | ||||
|     - does IO               IO () | ||||
|     - throws ...            throws .... | ||||
|       | ||||
| -} | ||||
| -- .... defined in frege.java.Lang | ||||
| -- native sleep java.lang.Thread.sleep :: Long -> IO () throws InterruptedException | ||||
|  | ||||
|        | ||||
| main args =   | ||||
|     forever do | ||||
|         current >>= print | ||||
|         print "\r" | ||||
|         stdout.flush | ||||
|         Thread.sleep 999 | ||||
|                  | ||||
							
								
								
									
										147
									
								
								samples/Frege/Concurrent.fr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								samples/Frege/Concurrent.fr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | ||||
| module examples.Concurrent where | ||||
|  | ||||
| import System.Random | ||||
| import Java.Net (URL) | ||||
| import Control.Concurrent as C | ||||
|  | ||||
| main2 args = do | ||||
|     m <- newEmptyMVar | ||||
|     forkIO do | ||||
|         m.put 'x' | ||||
|         m.put 'y'  | ||||
|         m.put 'z' | ||||
|     replicateM_ 3 do | ||||
|         c <- m.take | ||||
|         print "got: " | ||||
|         println c   | ||||
|          | ||||
|              | ||||
| example1 = do | ||||
|     forkIO (replicateM_ 100000 (putChar 'a')) | ||||
|     replicateM_ 100000 (putChar 'b') | ||||
|  | ||||
| example2 =  do | ||||
|     s <- getLine | ||||
|     case s.long of | ||||
|         Right n -> forkIO (setReminder n) >> example2 | ||||
|         Left _  -> println ("exiting ...") | ||||
|      | ||||
| setReminder :: Long -> IO () | ||||
| setReminder n = do | ||||
|         println ("Ok, I remind you in " ++ show n ++ " seconds") | ||||
|         Thread.sleep (1000L*n) | ||||
|         println (show n ++ " seconds is up!") | ||||
|  | ||||
| table = "table" | ||||
|              | ||||
| mainPhil _ = do | ||||
|     [fork1,fork2,fork3,fork4,fork5] <- mapM MVar.new [1..5] | ||||
|     forkIO (philosopher "Kant" fork5 fork1) | ||||
|     forkIO (philosopher "Locke" fork1 fork2) | ||||
|     forkIO (philosopher "Wittgenstein" fork2 fork3) | ||||
|     forkIO (philosopher "Nozick" fork3 fork4) | ||||
|     forkIO (philosopher "Mises" fork4 fork5) | ||||
|     return ()     | ||||
|  | ||||
| philosopher :: String -> MVar Int -> MVar Int -> IO () | ||||
| philosopher me left right = do | ||||
|     g <- Random.newStdGen | ||||
|     let phil g  = do | ||||
|             let (tT,g1) = Random.randomR (60L, 120L) g | ||||
|                 (eT, g2)  = Random.randomR (80L, 160L) g1 | ||||
|                 thinkTime = 300L * tT | ||||
|                 eatTime   = 300L * eT | ||||
|      | ||||
|             println(me ++ " is going to the dining room and takes his seat.")  | ||||
|             fl <- left.take             | ||||
|             println (me ++ " takes up left fork (" ++ show fl ++ ")") | ||||
|             rFork <- right.poll | ||||
|             case rFork of | ||||
|                 Just fr -> do  | ||||
|                     println (me ++ " takes up right fork. (" ++ show fr ++ ")")  | ||||
|                     println (me ++ " is going to eat for " ++ show eatTime ++ "ms") | ||||
|                     Thread.sleep eatTime | ||||
|                     println (me ++ " finished eating.") | ||||
|                     right.put fr | ||||
|                     println (me ++ " took down right fork.") | ||||
|                     left.put fl | ||||
|                     println (me ++ " took down left fork.") | ||||
|                     table.notifyAll  | ||||
|                     println(me ++ " is going to think for " ++ show thinkTime ++ "ms.") | ||||
|                     Thread.sleep thinkTime | ||||
|                     phil g2 | ||||
|                 Nothing -> do | ||||
|                     println (me ++ " finds right fork is already in use.") | ||||
|                     left.put fl | ||||
|                     println (me ++ " took down left fork.") | ||||
|                     table.notifyAll | ||||
|                     println (me ++ " is going to the bar to await notifications from table.") | ||||
|                     table.wait | ||||
|                     println (me ++ " got notice that something changed at the table.") | ||||
|                     phil g2 | ||||
|              | ||||
|         inter :: InterruptedException -> IO () | ||||
|         inter _ = return ()         | ||||
|      | ||||
|     phil g `catch` inter | ||||
|  | ||||
|      | ||||
| getURL xx = do | ||||
|         url <- URL.new xx  | ||||
|         con <- url.openConnection | ||||
|         con.connect | ||||
|         is  <- con.getInputStream | ||||
|         typ <- con.getContentType | ||||
|         -- stderr.println ("content-type is " ++ show typ)  | ||||
|         ir  <- InputStreamReader.new is (fromMaybe "UTF-8" (charset typ)) | ||||
|             `catch` unsupportedEncoding is  | ||||
|         br  <- BufferedReader.new ir | ||||
|         br.getLines | ||||
|     where | ||||
|         unsupportedEncoding :: InputStream -> UnsupportedEncodingException -> IO InputStreamReader | ||||
|         unsupportedEncoding is x = do | ||||
|             stderr.println x.catched | ||||
|             InputStreamReader.new is "UTF-8" | ||||
|              | ||||
|         charset ctyp = do | ||||
|             typ <- ctyp | ||||
|             case typ of | ||||
|                 m~´charset=(\S+)´ -> m.group 1 | ||||
|                 _ -> Nothing | ||||
|  | ||||
|      | ||||
| type SomeException = Throwable | ||||
|  | ||||
| main ["dining"] = mainPhil [] | ||||
|          | ||||
| main _ =  do | ||||
|     m1 <- MVar.newEmpty | ||||
|     m2 <- MVar.newEmpty | ||||
|     m3 <- MVar.newEmpty | ||||
|      | ||||
|     forkIO do | ||||
|         r <- (catchAll . getURL) "http://www.wikipedia.org/wiki/Haskell" | ||||
|         m1.put r | ||||
|      | ||||
|     forkIO do | ||||
|         r <- (catchAll . getURL) "htto://www.wikipedia.org/wiki/Java" | ||||
|         m2.put r | ||||
|      | ||||
|     forkIO do | ||||
|         r <- (catchAll . getURL) "http://www.wikipedia.org/wiki/Frege" | ||||
|         m3.put r | ||||
|      | ||||
|     r1 <- m1.take | ||||
|     r2 <- m2.take | ||||
|     r3 <- m3.take | ||||
|     println (result r1, result r2, result r3) | ||||
|     -- case r3 of | ||||
|     --     Right ss -> mapM_ putStrLn ss | ||||
|     --     Left _   -> return () | ||||
|   where | ||||
|     result :: (SomeException|[String]) -> (String|Int) | ||||
|     result (Left x)  = Left x.getClass.getName | ||||
|     result (Right y) = (Right . sum . map length)  y | ||||
|     -- mapM_ putStrLn r2 | ||||
|  | ||||
|          | ||||
							
								
								
									
										561
									
								
								samples/Frege/Sudoku.fr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										561
									
								
								samples/Frege/Sudoku.fr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,561 @@ | ||||
| package examples.Sudoku where | ||||
|  | ||||
| import Data.TreeMap (Tree, keys) | ||||
| import Data.List as DL hiding (find, union) | ||||
|  | ||||
|  | ||||
| type Element    = Int           -- 1,2,3,4,5,6,7,8,9 | ||||
| type Zelle      = [Element]     -- set of candidates | ||||
| type Position   = Int           -- 0..80 | ||||
| type Feld       = (Position, Zelle) | ||||
| type Brett      = [Feld] | ||||
|  | ||||
| --- data type for assumptions and conclusions | ||||
| data Assumption = | ||||
|               !ISNOT Position Element | ||||
|             | !IS    Position Element | ||||
|  | ||||
|  | ||||
| derive Eq Assumption | ||||
| derive Ord Assumption | ||||
| instance Show Assumption where | ||||
|     show (IS p e)    = pname p ++ "=" ++ e.show | ||||
|     show (ISNOT p e) = pname p ++ "/" ++ e.show | ||||
|  | ||||
| showcs cs = joined " " (map Assumption.show cs) | ||||
|  | ||||
| elements :: [Element]           -- all possible elements | ||||
| elements = [1 .. 9] | ||||
|  | ||||
| {- | ||||
|     a  b  c   d  e  f   g  h  i | ||||
|      0  1  2 | 3  4  5 | 6  7  8    1 | ||||
|      9 10 11 |12 13 14 |15 16 17    2 | ||||
|     18 19 20 |21 22 23 |24 25 26    3 | ||||
|     ---------|---------|-------- | ||||
|     27 28 29 |30 31 32 |33 34 35    4 | ||||
|     36 37 38 |39 40 41 |42 43 44    5 | ||||
|     45 46 47 |48 49 50 |51 52 53    6 | ||||
|     ---------|---------|-------- | ||||
|     54 55 56 |57 58 59 |60 61 62    7 | ||||
|     63 64 65 |66 67 68 |69 70 71    8 | ||||
|     72 73 74 |75 76 77 |78 79 80    9 | ||||
| -} | ||||
|  | ||||
| positions :: [Position]         -- all possible positions | ||||
| positions = [0..80] | ||||
| rowstarts :: [Position]         -- all positions where a row is starting | ||||
| rowstarts =  [0,9,18,27,36,45,54,63,72] | ||||
| colstarts :: [Position]         -- all positions where a column is starting | ||||
| colstarts =  [0,1,2,3,4,5,6,7,8] | ||||
| boxstarts :: [Position]         -- all positions where a box is starting | ||||
| boxstarts =  [0,3,6,27,30,33,54,57,60] | ||||
| boxmuster :: [Position]         -- pattern for a box, by adding upper left position results in real box | ||||
| boxmuster =  [0,1,2,9,10,11,18,19,20] | ||||
|  | ||||
|  | ||||
| --- extract field for position | ||||
| getf :: Brett -> Position  -> Feld | ||||
| getf (f:fs) p | ||||
|     | fst f == p = f | ||||
|     | otherwise  = getf fs p | ||||
| getf [] p = (p,[]) | ||||
|  | ||||
|  | ||||
| --- extract cell for position | ||||
| getc :: Brett -> Position -> Zelle | ||||
| getc b p = snd (getf b p) | ||||
|  | ||||
| --- compute the list of all positions that belong to the same row as a given position | ||||
| row :: Position -> [Position] | ||||
| row p = [z..(z+8)] where z = (p `quot` 9) * 9 | ||||
|  | ||||
| --- compute the list of all positions that belong to the same col as a given position | ||||
| col :: Position -> [Position] | ||||
| col p = map (c+) rowstarts where c = p `mod` 9 | ||||
|  | ||||
| --- compute the list of all positions that belong to the same box as a given position | ||||
| box :: Position -> [Position] | ||||
| box p  = map (z+) boxmuster where | ||||
|     ri = p `div` 27 * 27    -- 0, 27 or 54, depending on row | ||||
|     ci = p `mod` 9          -- column index 0..8, 0,1,2 is left, 3,4,5 is middle, 6,7,8 is right | ||||
|     cs = ci `div` 3 * 3     -- 0, 3 or 6 | ||||
|     z  = ri + cs | ||||
|  | ||||
| --- check if candidate set has exactly one member, i.e. field has been solved | ||||
| single :: Zelle -> Bool | ||||
| single [_] = true | ||||
| single _   = false | ||||
|  | ||||
| unsolved :: Zelle -> Bool | ||||
| unsolved [_] = false | ||||
| unsolved _   = true | ||||
|  | ||||
| -- list of rows, cols, boxes | ||||
| allrows = map row rowstarts | ||||
| allcols = map col colstarts | ||||
| allboxs = map box boxstarts | ||||
| allrcb  = zip (repeat "row") allrows | ||||
|           ++ zip (repeat "col") allcols | ||||
|           ++ zip (repeat "box") allboxs | ||||
|  | ||||
|  | ||||
| containers :: [(Position -> [Position], String)] | ||||
| containers = [(row, "row"), (col, "col"), (box, "box")] | ||||
|  | ||||
| -- ----------------- PRINTING ------------------------------------ | ||||
| -- printable coordinate of field, upper left is a1, lower right is i9 | ||||
| pname p = packed [chr (ord 'a' + p `mod` 9), chr (ord '1' + p `div` 9)] | ||||
|  | ||||
| -- print board | ||||
| printb b = mapM_ p1line allrows >> println "" | ||||
|     where | ||||
|         p1line row = do | ||||
|                 print (joined "" (map pfld line)) | ||||
|             where line = map (getc b) row | ||||
|  | ||||
| -- print field (brief) | ||||
| --   ? = no candidate | ||||
| --   5 = field is 5 | ||||
| --   . = some candidates | ||||
| pfld [] = "?" | ||||
| pfld [x] = show x | ||||
| pfld zs = "0" | ||||
|  | ||||
| -- print initial/final board | ||||
| result msg b = do | ||||
|         println ("Result: " ++ msg) | ||||
|         print   ("Board: ") | ||||
|         printb b | ||||
|         return b | ||||
|  | ||||
| res012 b = case concatMap (getc b) [0,1,2] of | ||||
|     [a,b,c] -> a*100+b*10+c | ||||
|     _ -> 9999999 | ||||
|  | ||||
| -- -------------------------- BOARD ALTERATION ACTIONS --------------------------------- | ||||
| -- print a message about what is done to the board and return the new board | ||||
| turnoff1 :: Position -> Zelle -> Brett -> IO Brett | ||||
| turnoff1 i off b | ||||
|     | single nc = do | ||||
|             -- print (pname i) | ||||
|             -- print ": set to " | ||||
|             -- print (head nc) | ||||
|             -- println " (naked single)" | ||||
|             return newb | ||||
|     | otherwise = return newb | ||||
|     where | ||||
|         cell   = getc b i | ||||
|         nc     = filter (`notElem` off) cell | ||||
|         newb   = (i, nc) : [ f | f <- b, fst f != i ] | ||||
|  | ||||
| turnoff :: Int -> Zelle -> String -> Brett -> IO Brett | ||||
| turnoff i off msg b = do | ||||
|         -- print (pname i) | ||||
|         -- print ": set to " | ||||
|         -- print nc | ||||
|         -- print " by clearing " | ||||
|         -- print off | ||||
|         -- print " " | ||||
|         -- println  msg | ||||
|         return newb | ||||
|     where | ||||
|         cell   = getc b i | ||||
|         nc     = filter (`notElem` off) cell | ||||
|         newb   = (i, nc) : [ f | f <- b, fst f != i ] | ||||
|  | ||||
| turnoffh ps off msg b = foldM toh b ps | ||||
|     where | ||||
|         toh b p = turnoff p off msg b | ||||
|  | ||||
| setto :: Position -> Element -> String -> Brett -> IO Brett | ||||
| setto i n cname b = do | ||||
|         -- print (pname i) | ||||
|         -- print ": set to " | ||||
|         -- print n | ||||
|         -- print " (hidden single in " | ||||
|         -- print cname | ||||
|         -- println ")" | ||||
|         return newb | ||||
|     where | ||||
|         nf     = [n] | ||||
|         newb   = (i, nf) : [ f | f <- b, fst f != i ] | ||||
|  | ||||
|  | ||||
| -- ----------------------------- SOLVING STRATEGIES --------------------------------------------- | ||||
| -- reduce candidate sets that contains numbers already in same row, col or box | ||||
| -- This finds (and logs) NAKED SINGLEs in passing. | ||||
| reduce b = [  turnoff1 p sss | (p,cell) <- b,               -- for each field | ||||
|                 unsolved cell,                              --  with more than 1 candidate | ||||
|                 --       single fields in containers that are candidates of that field | ||||
|                 sss = [ s | (rcb, _) <- containers, [s] <- map (getc b) (rcb p), s `elem` cell], | ||||
|                 sss != [] ]                                     -- collect field index, elements to remove from candidate set | ||||
|  | ||||
| -- look for a number that appears in exactly 1 candidate set of a container | ||||
| -- this number can go in no other place (HIDDEN SINGLE) | ||||
| hiddenSingle b = [ setto i n cname |                     -- select index, number, containername | ||||
|             (cname, rcb) <- allrcb,                 -- FOR rcb IN allrcb | ||||
|             n <- elements,                          --  FOR n IN elements | ||||
|             fs     = filter (unsolved • snd) (map (getf b) rcb), | ||||
|             occurs  = filter ((n `elem`) • snd) fs, | ||||
|             length occurs == 1, | ||||
|             (i, _) <- occurs ] | ||||
|  | ||||
| -- look for NAKED PAIRS, TRIPLES, QUADS | ||||
| nakedPair n b = [ turnoff p t ("(naked tuple in " ++ nm ++ ")") |           -- SELECT pos, tuple, name | ||||
|             -- n <- [2,3,4],                    //  FOR n IN [2,3,4] | ||||
|             (nm, rcb) <- allrcb,             --    FOR rcb IN containers | ||||
|             fs = map (getf b) rcb,              --      let fs = fields for rcb positions | ||||
|             u  = (fold union [] . filter unsolved . map snd) fs,   -- let u = union of non single candidates | ||||
|             t <- n `outof` u,                   --      FOR t IN n-tuples | ||||
|             hit = (filter ((`subset` t) . snd) . filter (unsolved . snd)) fs, | ||||
|             length hit == n, | ||||
|             (p, cell) <- fs, | ||||
|             p `notElem` map fst hit, | ||||
|             any (`elem` cell) t | ||||
|             ] | ||||
|  | ||||
| -- look for HIDDEN PAIRS, TRIPLES or QUADS | ||||
| hiddenPair n b = [ turnoff p off ("(hidden " ++ show t ++ " in " ++ nm ++ ")") |           -- SELECT pos, tuple, name | ||||
|             -- n <- [2,3,4],                    //  FOR n IN [2,3,4] | ||||
|             (nm, rcb) <- allrcb,             --    FOR rcb IN containers | ||||
|             fs = map (getf b) rcb,              --      let fs = fields for rcb positions | ||||
|             u  = (fold union [] . filter ((>1) . length) . map snd) fs,   -- let u = union of non single candidates | ||||
|             t <- n `outof` u,                   --      FOR t IN n-tuples | ||||
|             hit = (filter (any ( `elem` t) . snd) . filter (unsolved . snd)) fs, | ||||
|             length hit == n, | ||||
|             off = (fold union [] . map snd) hit `minus` t, | ||||
|             off != [], | ||||
|             (p, cell) <- hit, | ||||
|             ! (cell `subset` t) | ||||
|             ] | ||||
|  | ||||
| a `subset` b = all (`elem` b) a | ||||
| a `union`  b = uniq (sort (a ++ b)) | ||||
| a `minus`  b = filter (`notElem` b) a | ||||
| a `common` b = filter (`elem` b) a | ||||
| n `outof` as | ||||
|     | length as < n = [] | ||||
|     | [] <- as      = [] | ||||
|     | 1 >= n        = map (:[]) as | ||||
|     | (a:bs) <- as  = map (a:) ((n-1) `outof` bs) ++ (n `outof` bs) | ||||
|     | otherwise     = undefined  -- cannot happen because either as is empty or not | ||||
|  | ||||
| same f a b = b `elem` f a | ||||
|  | ||||
| intersectionlist = [(allboxs, row, "box/row intersection"), (allboxs, col, "box/col intersection"), | ||||
|                     (allrows ++ allcols, box, "line/box intersection")] | ||||
| intersections b = [ | ||||
|     turnoff pos [c] reason |    -- SELECT position, candidate, reson | ||||
|         (from, container, reason) <- intersectionlist, | ||||
|         rcb <- from, | ||||
|         fs = (filter (unsolved . snd) . map (getf b)) rcb,        -- fs = fields in from with more than 1 candidate | ||||
|         c <- (fold union [] • map snd) fs,                          -- FOR c IN union of candidates | ||||
|         cpos = (map fst • filter ((c `elem`) • snd)) fs,            -- cpos = positions where c occurs | ||||
|         cpos != [],                                                 -- WHERE cpos is not empty | ||||
|         all (same container (head cpos)) (tail cpos),               -- WHERE all positions are in the intersection | ||||
|         -- we can remove all occurences of c that are in container, but not in from | ||||
|         (pos, cell) <- map (getf b) (container (head cpos)), | ||||
|         c `elem` cell, | ||||
|         pos `notElem` rcb ] | ||||
|  | ||||
|  | ||||
| -- look for an XY Wing | ||||
| --  - there exists a cell A with candidates X and Y | ||||
| --  - there exists a cell B with candidates X and Z that shares a container with A | ||||
| --  - there exists a cell C with candidates Y and Z that shares a container with A | ||||
| -- reasoning | ||||
| --  - if A is X, B will be Z | ||||
| --  - if A is Y, C will be Z | ||||
| --  - since A will indeed be X or Y -> B or C will be Z | ||||
| --  - thus, no cell that can see B and C can be Z | ||||
| xyWing board = [ turnoff p [z] ("xy wing " ++ pname b ++ " " ++ pname c ++ " because of " ++ pname a) | | ||||
|         (a, [x,y]) <- board,                            -- there exists a cell a with candidates x and y | ||||
|         rcba = map (getf board) (row a ++ col a ++ box a),  -- rcba = all fields that share a container with a | ||||
|         (b, [b1, b2]) <- rcba, | ||||
|         b != a, | ||||
|         b1 == x && b2 != y || b2 == x && b1 != y,       -- there exists a cell B with candidates x and z | ||||
|         z = if b1 == x then b2 else b1, | ||||
|         (c, [c1, c2]) <- rcba, | ||||
|         c != a, c!= b, | ||||
|         c1 == y && c2 == z || c1 == z && c2 == y,       -- there exists a cell C with candidates y and z | ||||
|         ps = (uniq . sort) ((row b ++ col b ++ box b) `common` (row c ++ col c ++ box c)), | ||||
|         -- remove z in ps | ||||
|         (p, cs) <- map (getf board) ps, | ||||
|         p != b, p != c, | ||||
|         z `elem` cs ] | ||||
|  | ||||
| -- look for a N-Fish (2: X-Wing, 3: Swordfish, 4: Jellyfish) | ||||
| -- When all candidates for a particular digit in N rows are located | ||||
| -- in only N columns, we can eliminate all candidates from those N columns | ||||
| --  which are not located on those N rows | ||||
| fish n board = fish "row" allrows row col ++ fish "col" allcols col row where | ||||
|     fishname 2 = "X-Wing" | ||||
|     fishname 3 = "Swordfish" | ||||
|     fishname 4 = "Jellyfish" | ||||
|     fishname _ = "unknown fish" | ||||
|     fish nm allrows row col = [ turnoff p [x] (fishname n ++ " in " ++ nm ++ " " ++ show (map (pname . head) rset)) | | ||||
|         rset <- n `outof` allrows,          -- take n rows (or cols) | ||||
|         x <- elements,                      -- look for certain number | ||||
|         rflds = map (filter ((>1) . length . snd) . map (getf board)) rset,       -- unsolved fields in the rowset | ||||
|         colss  = (map (map (head . col . fst) . filter ((x `elem`) . snd)) rflds),   -- where x occurs in candidates | ||||
|         all ((>1) . length) colss,         -- x must appear in at least 2 cols | ||||
|         cols = fold union [] colss, | ||||
|         length cols == n, | ||||
|         cstart <- cols, | ||||
|         (p, cell) <- map (getf board) (col cstart), | ||||
|         x `elem` cell, | ||||
|         all (p `notElem`) rset] | ||||
|  | ||||
|  | ||||
| -- compute immediate consequences of an assumption of the form (p `IS` e) or (p `ISNOT` e) | ||||
| conseq board (IS p e) = uniq (sort ([ p `ISNOT` x | x <- getc board p, x != e ] ++ | ||||
|     [ a `ISNOT` e | | ||||
|         (a,cs) <- map (getf board) (row p ++ col p ++ box p), | ||||
|         a != p, | ||||
|         e `elem` cs | ||||
|     ])) | ||||
| conseq board (ISNOT p  e) = uniq (sort ([ p `IS` x | cs = getc board p, length cs == 2, x <- cs, x != e ] ++ | ||||
|     [ a `IS` e | | ||||
|         cp <- [row p, box p, col p], | ||||
|         as = (filter ((e `elem`) . getc board) . filter (p!=)) cp, | ||||
|         length as == 1, | ||||
|         a = head as | ||||
|     ])) | ||||
|  | ||||
| -- check if two assumptions contradict each other | ||||
| contradicts (IS a x)    (IS b y)    = a==b && x!=y | ||||
| contradicts (IS a x)    (ISNOT b y) = a==b && x==y | ||||
| contradicts (ISNOT a x) (IS b y)    = a==b && x==y | ||||
| contradicts (ISNOT _ _) (ISNOT _ _) = false | ||||
|  | ||||
| -- get the Position of an Assumption | ||||
| aPos (IS p _)    = p | ||||
| aPos (ISNOT p _) = p | ||||
|  | ||||
| -- get List of elements that must be turned off when assumption is true/false | ||||
| toClear board true  (IS p x)    = filter (x!=) (getc board p) | ||||
| toClear board false (IS p x)    = [x] | ||||
| toClear board true  (ISNOT p x) = [x] | ||||
| toClear board false (ISNOT p x) = filter (x!=) (getc board p) | ||||
|  | ||||
|  | ||||
| -- look for assumptions whose implications contradict themself | ||||
| chain board paths = [ solution a (head cs) (reverse cs) | | ||||
|         (a, css) <-  paths, | ||||
|         cs <- take 1 [ cs | cs <- css, contradicts a (head cs) ] | ||||
|         ] | ||||
|     where | ||||
|         solution a c cs = turnoff (aPos a) (toClear board false a) reason where | ||||
|             reason = "Assumption " ++ show a ++ " implies " ++ show c ++ "\n\t" | ||||
|                 ++ showcs cs ++ "\n\t" | ||||
|                 ++ "Therefore, " ++ show a ++ " must be false." | ||||
|  | ||||
| -- look for an assumption that yields to contradictory implications | ||||
| -- this assumption must be false | ||||
| chainContra board paths = [ solution a (reverse pro) (reverse contra) | | ||||
|         (a, css) <- paths,          -- FOR ALL assumptions "a" with list of conlusions "css" | ||||
|         (pro, contra) <- take 1 [ (pro, contra) | | ||||
|             pro <- (uniqBy (using head) . sortBy (comparing head)) css,                 -- FOR ALL conslusion chains "pro" | ||||
|             c = head pro,               -- LET "c" BE the final conclusion | ||||
|             contra <- take 1 (filter ((contradicts c) . head) css)   -- THE FIRST conclusion that contradicts c | ||||
|         ] | ||||
|       ] | ||||
|     where | ||||
|         solution a pro con = turnoff (aPos a) (toClear board false a) reason where | ||||
|             reason = ("assumption " ++ show a ++ " leads to contradictory conclusions\n\t" | ||||
|                         ++ showcs pro ++ "\n\t" ++ showcs con) | ||||
|  | ||||
|  | ||||
|  | ||||
| -- look for a common implication c of some assumptions ai, where at least 1 ai is true | ||||
| -- so that (a0 OR a1 OR a2 OR ...) IMPLIES c | ||||
| -- For all cells pi in same container that have x as candidate, we can construct (p0==x OR p1==x OR ... OR pi==x) | ||||
| -- For a cell p with candidates ci, we can construct (p==c0 OR p==c1) | ||||
| cellRegionChain board paths = [ solution b as (map head os) | | ||||
|         as <- cellas ++ regionas,           -- one of as must be true | ||||
|         iss = filter ((`elem` as) . fst) paths,    -- the implications for as | ||||
|         (a, ass) <- take 1 iss,             -- implications for first assumption | ||||
|         fs <- (uniqBy (using head) . sortBy (comparing head)) ass, | ||||
|         b = head fs,                        -- final conclusions of first assumption | ||||
|         os = [fs] : map (take 1 . filter ((b==) . head) . snd) (tail iss), -- look for implications with same conclusion | ||||
|         all ([]!=) os] | ||||
|     where | ||||
|         cellas   = [ map (p `IS`) candidates | (p, candidates@(_:_:_)) <- board ] | ||||
|         regionas = [ map (`IS` e) ps | | ||||
|             region <- map (map (getf board)) (allrows ++ allcols ++ allboxs), | ||||
|             e <- elements, | ||||
|             ps = map fst (filter ((e `elem`) . snd) region), | ||||
|             length ps > 1 ] | ||||
|         solution b as oss = turnoff (aPos b) (toClear board true b) reason where | ||||
|             reason = "all of the assumptions " ++ joined ", " (map show as) ++ " imply " ++ show b ++ "\n\t" | ||||
|                 ++ joined "\n\t" (map (showcs . reverse) oss) ++ "\n\t" | ||||
|                 ++ "One of them must be true, so " ++ show b ++ " must be true." | ||||
|  | ||||
|  | ||||
| {- | ||||
|     Wir brauchen für einige Funktionen eine Datenstruktur wie | ||||
|         [ (Assumption, [[Assumption]]) ] | ||||
|     d.i. eine Liste von möglichen Annahmen samt aller Schlußketten. | ||||
|     Idealerweise sollte die Schlußkette in umgekehrter Reihenfolge vorliegen, | ||||
|     dann kann man einfach finden: | ||||
|     - Annahmen, die zum Selbstwiderspruch führen. | ||||
|     - alles, was aus einer bestimmten Annahme folgt (map (map head) [[a]]) | ||||
|     -... | ||||
| -} | ||||
| --- Liste aller Annahmen für ein bestimmtes Brett | ||||
| assumptions :: Brett -> [Assumption] | ||||
| assumptions board = [ a | | ||||
|                 (p, cs) <- board, | ||||
|                 !(single cs), | ||||
|                 a <- map (ISNOT p) cs ++ map (IS p) cs ] | ||||
|  | ||||
| consequences :: Brett -> [Assumption] -> [[Assumption]] | ||||
| consequences board as = map (conseq board) as | ||||
|  | ||||
| acstree :: Brett -> Tree Assumption [Assumption] | ||||
| acstree board = Tree.fromList (zip as cs) | ||||
|     where | ||||
|         as = assumptions  board | ||||
|         cs = consequences board as | ||||
|  | ||||
| -- bypass maybe on tree lookup | ||||
| find :: Tree Assumption [Assumption] -> Assumption -> [Assumption] | ||||
| find t a | ||||
|     | Just cs <- t.lookup a = cs | ||||
|     | otherwise = error ("no consequences for " ++ show a) | ||||
|  | ||||
| -- for performance resons, we confine ourselves to implication chains of length 20 per assumption | ||||
| mkPaths :: Tree Assumption [Assumption] -> [ (Assumption, [[Assumption]]) ] | ||||
| mkPaths acst = map impl  (keys acst)   -- {[a1], [a2], [a3] ] | ||||
|     where | ||||
|         -- [Assumption] -> [(a, [chains, ordered by length] | ||||
|         impl a = (a, impls [[a]]) | ||||
|         impls ns = (take 1000 • concat • takeUntil null • iterate expandchain) ns | ||||
|         -- expandchain :: [[Assumption]] -> [[Assumption]] | ||||
|         expandchain css = [ (n:a:as) | | ||||
|             (a : as) <- css,               -- list of assumptions | ||||
|             n <- find acst a,              -- consequences of a | ||||
|             n `notElem` as                 -- avoid loops | ||||
|           ] | ||||
|         -- uni (a:as) = a : uni (filter ((head a !=) • head) as) | ||||
|         -- uni [] = empty | ||||
|         -- empty = [] | ||||
|  | ||||
|  | ||||
| -- ------------------ SOLVE A SUDOKU -------------------------- | ||||
| -- Apply all available strategies until nothing changes anymore | ||||
| -- Strategy functions are supposed to return a list of | ||||
| -- functions, which, when applied to a board, give a changed board. | ||||
| -- When a strategy does not find anything to alter, | ||||
| -- it returns [], and the next strategy can be tried. | ||||
| solve b | ||||
|     | all (single . snd) b       = result "Solved" b | ||||
|     | any (([]==) . snd) b       = result "not solvable" b | ||||
|     | res@(_:_) <- reduce b       = apply b res >>=solve       -- compute smallest candidate sets | ||||
|     -- comment "candidate sets are up to date" = () | ||||
|     | res@(_:_) <- hiddenSingle b  = apply b res >>= solve     -- find HIDDEN SINGLES | ||||
|     -- comment "no more hidden singles" = () | ||||
|     | res@(_:_) <- intersections b = apply b res >>= solve     -- find locked candidates | ||||
|     -- comment "no more intersections" = () | ||||
|     | res@(_:_) <- nakedPair 2 b     = apply b res >>= solve     -- find NAKED PAIRS, TRIPLES or QUADRUPELS | ||||
|     -- comment "no more naked pairs" = () | ||||
|     | res@(_:_) <- hiddenPair  2 b   = apply b res >>= solve      -- find HIDDEN PAIRS, TRIPLES or QUADRUPELS | ||||
|     -- comment "no more hidden pairs" = () | ||||
|     -- res@(_:_) <- nakedPair 3 b     = apply b res >>= solve       // find NAKED PAIRS, TRIPLES or QUADRUPELS | ||||
|     -- | comment "no more naked triples" = () | ||||
|     -- res@(_:_) <- hiddenPair  3 b    = apply b res >>= solve      // find HIDDEN PAIRS, TRIPLES or QUADRUPELS | ||||
|     -- | comment "no more hidden triples" = () | ||||
|     -- res@(_:_) <- nakedPair 4 b     = apply b res >>=solve       // find NAKED PAIRS, TRIPLES or QUADRUPELS | ||||
|     -- | comment "no more naked quadruples" = () | ||||
|     -- res@(_:_) <- hiddenPair  4 b    = apply b res >>=solve      // find HIDDEN PAIRS, TRIPLES or QUADRUPELS | ||||
|     -- | comment "no more hidden quadruples" = () | ||||
|     | res@(_:_) <- xyWing b            = apply b res >>=solve      -- find XY WINGS | ||||
|     -- comment "no more xy wings"       = () | ||||
|     | res@(_:_) <- fish 2 b            = apply b res >>=solve      -- find 2-FISH | ||||
|     -- comment "no more x-wings"        = () | ||||
|     -- res@(_:_) <- fish 3 b            = apply b res >>=solve      // find 3-FISH | ||||
|     -- | comment "no more swordfish"      = () | ||||
|     -- res@(_:_) <- fish 4 b            = apply b res >>=solve      // find 4-FISH | ||||
|     -- | comment "no more jellyfish"      = () | ||||
|     -- | comment pcomment                 = () | ||||
|     | res@(_:_) <- chain b paths             = apply b (take 9 res) >>= solve  -- find forcing chains | ||||
|     | res@(_:_) <- cellRegionChain b paths   = apply b (take 9 res) >>= solve  -- find common conclusion for true assumption | ||||
|     | res@(_:_) <- chainContra b paths       = apply b (take 9 res) >>= solve  -- find assumptions that allow to infer both a and !a | ||||
|     -- comment "consistent conclusions only"       = () | ||||
|  | ||||
|     | otherwise = result "ambiguous" b | ||||
|     where | ||||
|         apply brd fs = foldM (\b\f -> f b) brd fs | ||||
|         paths = mkPaths (acstree b) | ||||
|         -- pcomment = show (length paths) ++ " assumptions with " ++ show (fold (+) 0 (map (length <~ snd) paths)) | ||||
|         --    ++ " implication chains" | ||||
|  | ||||
| -- comment com = do stderr << com << "\n" for false | ||||
| -- log com     = do stderr << com << "\n" for true | ||||
|  | ||||
| --- turn a string into a row | ||||
| mkrow :: String -> [Zelle] | ||||
| mkrow s = mkrow1 xs | ||||
|     where | ||||
|         xs = s ++ "---------" -- make sure at least 9 elements | ||||
|         mkrow1 xs = (take 9 • filter ([]!=) • map f • unpacked) xs | ||||
|         f x | x >= '1' && x <= '9'  =  [ord x - ord '0'] | ||||
|             | x == ' '  = []    -- ignored | ||||
|             | otherwise = elements | ||||
|  | ||||
| main ["-h"]    = main [] | ||||
| main ["-help"] = main [] | ||||
| main [] = do | ||||
|         mapM_ stderr.println [ | ||||
|             "usage: java Sudoku file ...", | ||||
|             "       java Sudoku position", | ||||
|             "where position is a 81 char string consisting of digits", | ||||
|             "One can get such a string by going to", | ||||
|             "http://www.sudokuoftheday.com/pages/s-o-t-d.php", | ||||
|             "Right click on the puzzle and open it in new tab", | ||||
|             "Copy the 81 digits from the URL in the address field of your browser.", | ||||
|             "", | ||||
|             "There is also a file with hard sudokus in examples/top95.txt\n"] | ||||
|         return () | ||||
|  | ||||
|  | ||||
| main [s@#^[0-9\W]{81}$#] = solve board >> return () | ||||
|     where | ||||
|         board = zip positions felder | ||||
|         felder = decode s | ||||
|  | ||||
| main files = forM_ files sudoku | ||||
|     where | ||||
|         sudoku file = do | ||||
|             br <- openReader file | ||||
|             lines <- BufferedReader.getLines br | ||||
|             bs <- process lines | ||||
|             ss <- mapM (\b -> print "Puzzle: " >> printb b >> solve b) bs | ||||
|             println ("Euler: " ++ show (sum (map res012 ss))) | ||||
|             return () | ||||
|  | ||||
| -- "--3-" => [1..9, 1..9, [3], 1..9] | ||||
| decode s = map candi (unpacked s) where | ||||
|         candi c | c >= '1' && c <= '9'  = [(ord c - ord '0')] | ||||
|                 | otherwise = elements | ||||
| process [] = return [] | ||||
| process (s:ss) | ||||
|     | length s == 81 = consider b1 | ||||
|     | length s == 9, | ||||
|       length acht == 8, | ||||
|       all ((9==) • length) acht = consider b2 | ||||
|     | otherwise = do | ||||
|             stderr.println ("skipped line: " ++ s) | ||||
|             process ss | ||||
|     where | ||||
|         acht = take 8 ss | ||||
|         neun = fold (++) "" (s:acht) | ||||
|         b1 = zip positions (decode s) | ||||
|         b2 = zip positions (decode neun) | ||||
|         consider b = do | ||||
|             -- print "Puzzle: " | ||||
|             -- printb b | ||||
|             bs <- process ss | ||||
|             return (b:bs) | ||||
|  | ||||
							
								
								
									
										79
									
								
								samples/Frege/SwingExamples.fr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								samples/Frege/SwingExamples.fr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| package examples.SwingExamples where | ||||
|  | ||||
| import Java.Awt  (ActionListener) | ||||
| import Java.Swing | ||||
|  | ||||
|  | ||||
| main _ = do | ||||
|     rs <- mapM Runnable.new [helloWorldGUI, buttonDemoGUI, celsiusConverterGUI] | ||||
|     mapM_ invokeLater rs | ||||
|     println "Hit enter to end ...." | ||||
|     s <- getLine | ||||
|     return () | ||||
|  | ||||
| celsiusConverterGUI = do | ||||
|     tempTextField   <- JTextField.new() | ||||
|     celsiusLabel    <- JLabel.new () | ||||
|     convertButton   <- JButton.new () | ||||
|     fahrenheitLabel <- JLabel.new ()  | ||||
|     frame           <- JFrame.new () | ||||
|     frame.setDefaultCloseOperation JFrame.dispose_on_close | ||||
|     frame.setTitle "Celsius Converter" | ||||
|     celsiusLabel.setText  "Celsius" | ||||
|     convertButton.setText "Convert" | ||||
|     let convertButtonActionPerformed _ = do | ||||
|             celsius <- tempTextField.getText | ||||
|             case celsius.double of | ||||
|                 Left _  -> fahrenheitLabel.setText ("not a valid number: " ++ celsius) | ||||
|                 Right c -> fahrenheitLabel.setText (show (c*1.8 + 32.0).long ++ " Fahrenheit")  | ||||
|             return () | ||||
|     ActionListener.new convertButtonActionPerformed >>= convertButton.addActionListener | ||||
|     fahrenheitLabel.setText "Fahrenheit" | ||||
|     contentPane <- frame.getContentPane | ||||
|     layout      <- GroupLayout.new contentPane | ||||
|     contentPane.setLayout layout | ||||
|     -- TODO continue | ||||
|     -- http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/learn/CelsiusConverterProject/src/learn/CelsiusConverterGUI.java | ||||
|     frame.pack | ||||
|     frame.setVisible true | ||||
|  | ||||
| helloWorldGUI = do | ||||
|     frame <- JFrame.new "Hello World Frege" | ||||
|     frame.setDefaultCloseOperation(JFrame.dispose_on_close) | ||||
|     label <- JLabel.new "Hello World!" | ||||
|     cp <- frame.getContentPane | ||||
|     cp.add label | ||||
|     frame.pack | ||||
|     frame.setVisible true | ||||
|  | ||||
| buttonDemoGUI = do | ||||
|     frame <- JFrame.new "Button Demo" | ||||
|     frame.setDefaultCloseOperation(JFrame.dispose_on_close) | ||||
|     newContentPane <- JPanel.new () | ||||
|     b1::JButton <- JButton.new "Disable middle button" | ||||
|     b1.setVerticalTextPosition   SwingConstants.center | ||||
|     b1.setHorizontalTextPosition SwingConstants.leading | ||||
|     b2::JButton <- JButton.new "Middle button" | ||||
|     b2.setVerticalTextPosition   SwingConstants.center | ||||
|     b2.setHorizontalTextPosition SwingConstants.leading | ||||
|     b3::JButton <- JButton.new "Enable middle button" | ||||
|     b3.setVerticalTextPosition   SwingConstants.center | ||||
|     b3.setHorizontalTextPosition SwingConstants.leading | ||||
|     b3.setEnabled false | ||||
|     let action1 _ = do | ||||
|             b2.setEnabled false | ||||
|             b1.setEnabled false | ||||
|             b3.setEnabled true | ||||
|         action3 _ = do | ||||
|             b2.setEnabled true | ||||
|             b1.setEnabled true | ||||
|             b3.setEnabled false | ||||
|     ActionListener.new action1  >>= b1.addActionListener | ||||
|     ActionListener.new action3  >>= b3.addActionListener  | ||||
|     newContentPane.add b1 | ||||
|     newContentPane.add b2 | ||||
|     newContentPane.add b3 | ||||
|     newContentPane.setOpaque true | ||||
|     frame.setContentPane newContentPane | ||||
|     frame.pack | ||||
|     frame.setVisible true | ||||
		Reference in New Issue
	
	Block a user