module Main where import Test.Hspec import Graph.Superbubbles import qualified Data.Map.Strict as M import qualified Data.Set as S type Graph = M.Map Int [Int] getBubble :: Graph -> Int -> Either BubbleError Int getBubble graph start = findSuperbubble getChilds getParents start where getChilds v = getGraph v graph getParents v = getGraph v rgraph rgraph = revgraph graph getGraph :: Int -> M.Map Int [Int] -> S.Set Int getGraph = (S.fromList .) . M.findWithDefault [] revgraph :: Graph -> Graph revgraph graph = M.fromListWith (++) $ do (p, cs) <- M.toList graph c <- cs return (c,[p]) glw :: Graph glw = M.fromListWith (++) [ (1, [273]) , (1, [160]) , (2, [42]) , (2, [168]) , (3, [150]) , (3, [19]) , (4, [104]) , (4, [342]) , (4, [276]) , (5, [166]) , (6, [266]) , (6, [310]) , (7, [33]) , (9, [196]) , (10, [51]) , (10, [195]) , (10, [339]) , (12, [58]) , (12, [167]) , (12, [329]) , (12, [58]) , (12, [329]) , (13, [155]) , (14, [305]) , (15, [244]) , (16, [268]) , (17, [166]) , (18, [173]) , (18, [266]) , (18, [310]) , (19, [71]) , (20, [186]) , (21, [314]) , (21, [314]) , (21, [314]) , (21, [314]) , (21, [314]) , (21, [314]) , (21, [314]) , (21, [314]) , (21, [314]) , (21, [314]) , (22, [119]) , (22, [341]) , (23, [144]) , (23, [295]) , (24, [177]) , (24, [253]) , (24, [319]) , (25, [116]) , (25, [153]) , (26, [248]) , (26, [66]) , (27, [312]) , (28, [106]) , (28, [320]) , (29, [222]) , (30, [258]) , (31, [176]) , (31, [254]) , (32, [186]) , (33, [296]) , (33, [88]) , (34, [345]) , (35, [13]) , (35, [155]) , (35, [293]) , (36, [145]) , (36, [210]) , (36, [275]) , (37, [122]) , (37, [323]) , (37, [257]) , (38, [269]) , (38, [313]) , (39, [346]) , (39, [156]) , (40, [97]) , (40, [242]) , (41, [194]) , (41, [251]) , (42, [168]) , (43, [286]) , (45, [311]) , (45, [159]) , (46, [214]) , (46, [230]) , (47, [111]) , (47, [307]) , (48, [268]) , (49, [100]) , (50, [249]) , (51, [103]) , (51, [249]) , (52, [338]) , (52, [234]) , (53, [321]) , (53, [154]) , (55, [347]) , (55, [3]) , (56, [127]) , (57, [282]) , (57, [282]) , (57, [282]) , (57, [282]) , (57, [282]) , (57, [282]) , (57, [282]) , (57, [282]) , (57, [282]) , (57, [282]) , (58, [197]) , (59, [332]) , (59, [311]) , (60, [76]) , (61, [181]) , (63, [264]) , (63, [188]) , (63, [201]) , (64, [229]) , (64, [134]) , (64, [208]) , (65, [32]) , (66, [218]) , (67, [300]) , (68, [306]) , (69, [311]) , (69, [311]) , (70, [44]) , (71, [11]) , (71, [54]) , (71, [235]) , (72, [226]) , (72, [56]) , (72, [276]) , (73, [336]) , (74, [240]) , (76, [33]) , (77, [320]) , (77, [28]) , (78, [278]) , (78, [337]) , (79, [40]) , (80, [15]) , (80, [189]) , (81, [260]) , (81, [281]) , (82, [55]) , (82, [347]) , (83, [227]) , (83, [297]) , (85, [124]) , (86, [215]) , (86, [303]) , (86, [129]) , (88, [179]) , (88, [150]) , (88, [71]) , (89, [233]) , (89, [212]) , (90, [132]) , (90, [274]) , (91, [245]) , (91, [245]) , (91, [245]) , (91, [245]) , (91, [245]) , (92, [183]) , (93, [137]) , (94, [240]) , (95, [239]) , (95, [28]) , (96, [112]) , (97, [152]) , (98, [244]) , (98, [115]) , (99, [326]) , (99, [163]) , (100, [30]) , (100, [267]) , (101, [222]) , (102, [325]) , (102, [64]) , (102, [164]) , (103, [249]) , (103, [249]) , (104, [231]) , (104, [177]) , (105, [286]) , (105, [120]) , (106, [320]) , (107, [74]) , (107, [294]) , (108, [343]) , (108, [168]) , (109, [120]) , (110, [65]) , (110, [331]) , (111, [265]) , (112, [230]) , (113, [73]) , (113, [267]) , (114, [206]) , (114, [63]) , (114, [8]) , (115, [80]) , (115, [324]) , (115, [162]) , (116, [314]) , (116, [314]) , (116, [314]) , (116, [314]) , (116, [314]) , (116, [314]) , (116, [314]) , (116, [314]) , (116, [314]) , (116, [314]) , (117, [37]) , (117, [148]) , (117, [292]) , (118, [279]) , (118, [23]) , (118, [340]) , (119, [240]) , (120, [225]) , (121, [186]) , (122, [96]) , (122, [46]) , (122, [112]) , (123, [40]) , (124, [33]) , (125, [300]) , (127, [217]) , (127, [143]) , (128, [237]) , (129, [4]) , (130, [314]) , (131, [121]) , (131, [301]) , (132, [317]) , (132, [150]) , (133, [268]) , (134, [38]) , (134, [304]) , (135, [244]) , (136, [10]) , (137, [259]) , (137, [20]) , (138, [232]) , (138, [244]) , (139, [27]) , (139, [114]) , (140, [265]) , (141, [278]) , (141, [337]) , (143, [289]) , (143, [186]) , (144, [349]) , (145, [200]) , (146, [345]) , (147, [47]) , (148, [122]) , (148, [323]) , (148, [257]) , (149, [223]) , (149, [250]) , (150, [261]) , (150, [334]) , (151, [262]) , (151, [110]) , (152, [216]) , (152, [49]) , (152, [193]) , (153, [241]) , (153, [130]) , (154, [308]) , (154, [197]) , (155, [265]) , (156, [213]) , (157, [65]) , (157, [331]) , (158, [220]) , (160, [268]) , (161, [186]) , (162, [244]) , (162, [302]) , (163, [240]) , (164, [172]) , (164, [52]) , (164, [256]) , (165, [186]) , (166, [328]) , (166, [267]) , (167, [197]) , (168, [314]) , (168, [25]) , (169, [39]) , (169, [249]) , (169, [339]) , (171, [27]) , (171, [114]) , (172, [52]) , (172, [256]) , (172, [64]) , (173, [91]) , (173, [6]) , (173, [283]) , (174, [162]) , (175, [53]) , (175, [209]) , (176, [322]) , (176, [45]) , (176, [277]) , (177, [276]) , (177, [342]) , (178, [200]) , (179, [82]) , (179, [150]) , (179, [71]) , (180, [337]) , (181, [186]) , (182, [177]) , (183, [311]) , (183, [159]) , (184, [240]) , (185, [286]) , (185, [120]) , (186, [169]) , (186, [186]) , (187, [265]) , (188, [312]) , (189, [162]) , (189, [244]) , (192, [32]) , (193, [100]) , (194, [215]) , (194, [303]) , (194, [129]) , (194, [86]) , (195, [249]) , (195, [50]) , (196, [79]) , (196, [123]) , (197, [78]) , (197, [141]) , (197, [247]) , (198, [138]) , (199, [143]) , (200, [7]) , (200, [60]) , (200, [85]) , (200, [158]) , (200, [270]) , (201, [285]) , (201, [70]) , (202, [31]) , (203, [268]) , (204, [73]) , (204, [267]) , (205, [213]) , (206, [312]) , (207, [47]) , (208, [134]) , (209, [197]) , (210, [275]) , (210, [330]) , (215, [4]) , (215, [83]) , (216, [100]) , (217, [199]) , (217, [143]) , (218, [43]) , (218, [105]) , (219, [312]) , (220, [33]) , (221, [88]) , (222, [175]) , (222, [315]) , (223, [265]) , (224, [146]) , (224, [34]) , (225, [350]) , (226, [56]) , (226, [276]) , (227, [4]) , (228, [27]) , (228, [114]) , (229, [134]) , (229, [208]) , (229, [164]) , (230, [93]) , (230, [137]) , (231, [182]) , (231, [177]) , (231, [24]) , (231, [253]) , (231, [319]) , (232, [149]) , (232, [250]) , (232, [68]) , (232, [223]) , (233, [37]) , (233, [148]) , (233, [292]) , (235, [132]) , (235, [90]) , (236, [222]) , (237, [309]) , (238, [169]) , (238, [186]) , (239, [77]) , (239, [28]) , (240, [29]) , (240, [236]) , (240, [101]) , (240, [29]) , (240, [236]) , (240, [101]) , (241, [21]) , (242, [152]) , (243, [240]) , (244, [147]) , (244, [47]) , (244, [207]) , (245, [266]) , (245, [310]) , (249, [39]) , (250, [244]) , (250, [68]) , (250, [223]) , (251, [194]) , (253, [303]) , (253, [177]) , (254, [344]) , (254, [69]) , (254, [183]) , (255, [268]) , (256, [134]) , (257, [335]) , (257, [181]) , (258, [272]) , (258, [17]) , (258, [5]) , (259, [161]) , (260, [240]) , (261, [95]) , (261, [198]) , (262, [65]) , (264, [312]) , (265, [202]) , (265, [202]) , (266, [32]) , (267, [128]) , (267, [309]) , (268, [125]) , (268, [333]) , (269, [349]) , (270, [33]) , (271, [151]) , (271, [157]) , (271, [65]) , (272, [5]) , (273, [160]) , (274, [132]) , (276, [14]) , (276, [305]) , (277, [311]) , (277, [59]) , (278, [41]) , (278, [180]) , (279, [23]) , (279, [340]) , (280, [2]) , (280, [108]) , (281, [240]) , (282, [187]) , (283, [245]) , (284, [9]) , (285, [312]) , (286, [109]) , (287, [175]) , (288, [244]) , (289, [165]) , (289, [186]) , (290, [200]) , (291, [244]) , (293, [155]) , (294, [240]) , (295, [340]) , (296, [88]) , (296, [221]) , (297, [32]) , (298, [121]) , (298, [301]) , (299, [118]) , (299, [102]) , (300, [224]) , (300, [316]) , (300, [81]) , (300, [22]) , (300, [99]) , (301, [20]) , (302, [15]) , (303, [173]) , (303, [18]) , (305, [32]) , (306, [35]) , (307, [57]) , (307, [140]) , (307, [282]) , (308, [197]) , (309, [26]) , (310, [32]) , (311, [299]) , (312, [117]) , (312, [89]) , (313, [349]) , (314, [290]) , (314, [36]) , (314, [178]) , (315, [287]) , (315, [190]) , (315, [175]) , (316, [107]) , (316, [94]) , (319, [271]) , (319, [177]) , (320, [138]) , (321, [12]) , (321, [197]) , (321, [12]) , (321, [197]) , (322, [277]) , (323, [131]) , (323, [298]) , (323, [121]) , (324, [135]) , (324, [174]) , (324, [288]) , (325, [64]) , (325, [164]) , (326, [184]) , (328, [113]) , (328, [204]) , (328, [73]) , (328, [267]) , (329, [197]) , (330, [200]) , (331, [65]) , (332, [92]) , (332, [183]) , (333, [300]) , (333, [67]) , (334, [98]) , (334, [115]) , (334, [291]) , (335, [161]) , (335, [61]) , (336, [109]) , (336, [185]) , (337, [139]) , (337, [228]) , (337, [171]) , (338, [269]) , (338, [349]) , (339, [249]) , (339, [50]) , (340, [64]) , (340, [164]) , (341, [240]) , (342, [72]) , (342, [56]) , (342, [226]) , (343, [168]) , (344, [183]) , (345, [243]) , (346, [280]) , (346, [280]) , (346, [205]) , (347, [150]) , (348, [125]) , (348, [333]) , (349, [87]) , (349, [284]) ] main :: IO () main = hspec $ do describe "Lone wolf graph" $ do let lw = getBubble glw it "B(001)" $ lw 1 `shouldBe` Right 160 it "B(160)" $ lw 160 `shouldBe` Left NotFound it "B(016)" $ lw 16 `shouldBe` Left NotFound it "B(048)" $ lw 48 `shouldBe` Left NotFound it "B(268)" $ lw 268 `shouldBe` Left NotFound it "B(300)" $ lw 300 `shouldBe` Right 240 it "B(224)" $ lw 224 `shouldBe` Right 345 it "B(022)" $ lw 022 `shouldBe` Left NotFound it "B(240)" $ lw 240 `shouldBe` Right 222 it "B(175)" $ lw 175 `shouldBe` Right 197 it "B(222)" $ lw 222 `shouldBe` Left Tip it "B(175)" $ lw 175 `shouldBe` Right 197 it "B(337)" $ lw 337 `shouldBe` Left Tip it "B(280)" $ lw 280 `shouldBe` Right 168 it "B(168)" $ lw 168 `shouldBe` Right 314 it "B(200)" $ lw 200 `shouldBe` Right 33 it "B(150)" $ lw 150 `shouldBe` Right 265